2012-07-23 43 views
53

在我的apache服務器上,我希望能夠將所有傳入的http請求重定向到相應的https請求。問題在於,我希望能夠爲我的默認虛擬主機執行此操作,而無需指定ServerName,並且可以使用請求url中出現的任何服務器名稱進行重定向。我希望這樣的事情:將HTTP重定向到默認虛擬主機上的HTTPS而無需ServerName

NameVirtualHost *:80 
<VirtualHost *:80> 
    RedirectPermanent/https://%{SERVER_NAME}/ 
    ... 
</VirtualHost> 

使用Redirect這是可能的,否則我將不得不訴諸Rewrite

回答

80

嘗試在你的虛擬主機的配置添加此:

RewriteEngine On 
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] 
+0

*您可能需要添加的mod_rewrite。對於基於ubuntu或debian的主機,以下內容將起作用:'sudo a2enmod rewrite',它可以阻止任何configtest/apache2配置錯誤。 (如果你使用上面提供的虛擬主機添加,你可以得到一個股票設置) – 2014-11-12 05:28:21

+0

這隻適用於主域名(例如'http:// mywebiste.com' - >'https:// mywebiste.com')如果我也subdomaind('http://blog.mywebiste.com'->'https:// blog.mywebiste.com')? – EsseTi 2016-03-13 14:36:38

+7

您可能需要添加**的RewriteCond%{} HTTPS關閉** **後RewriteEngine敘述在**否則你可能會得到一個** ** ERR_TOO_MANY_REDIRECTS我 – Max 2016-03-24 14:42:39

27

這是省略不必要的重定向的完整的方式,太;)

這些規則意在.htaccess文件中使用,作爲RewriteRule在*:80 VirtualHost條目中不需要任何條件。

RewriteEngine on 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

Eplanations

RewriteEngine on 

==>使發動機在所有

RewriteCond %{HTTPS} off [OR] 

==>匹配上非HTTPS連接,或者(未設置[ OR]會導致隱式AND!)

RewriteCond %{HTTP:X-Forwarded-Proto} !https 

==>匹配上轉發連接(代理,負載均衡器等)而不 HTTPS

RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

==>如果兩個條件匹配的一個,做整個URL的重寫,發送301讓客戶瞭解這一點(有些人會這樣做,有些人不會),而L則是最後一個規則。

+0

另一個問題是,你的'RewriteRule'可能永遠不會匹配;很確定你想刪除斜線:​​'重寫規則^(。*)...' – 2013-12-02 08:30:00

+0

很確定我不會。你錯過了包括'L'標誌在內的目標的語法。另一種方式就是像Jon Lin那樣做。 – 2013-12-02 17:55:19

+6

在這種情況下,RewriteCond是完全多餘的;由於VirtualHost已經被定義爲'',所以'%{SERVER_PORT}'永遠不會是443,因此條件將始終匹配。 – 2014-05-30 16:34:01

63

兩者都正常工作。但根據Apache docs您應該避免使用mod_rewrite進行簡單重定向,並使用Redirect代替。因此,據他們說,你最好這樣做:

<VirtualHost *:80> 
    ServerName www.example.com 
    Redirect/https://www.example.com/ 
</VirtualHost> 

<VirtualHost *:443> 
    ServerName www.example.com 
    # ... SSL configuration goes here 
</VirtualHost> 

Redirect後的第一個/是URL,第二部分是,它應該被重定向。

你也可以用它來網址重定向到一個子域: Redirect /one/ http://one.example.com/

+1

這似乎是最新的答案。 +1 – 2015-11-30 11:53:50

+23

這不回答**沒有指定問題的ServerName **部分 – 2016-03-31 14:52:43

相關問題