2013-08-20 40 views
7

我有我的.htaccess中的規則重定向循環使用,同時重定向所有的HTTP請求到https的.htaccess

# to redirect http to https 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://www.example.com/$1 [R=301,L] 

# to redirect urls with index.php to/
RewriteCond %{THE_REQUEST} ^.*/index.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L] 

# to redirect non www requests to www url 
RewriteCond %{HTTP_HOST} !^www\.example\.com 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

當我試圖訪問的網站,它變成一個重定向循環。如何解決此問題並正確重定向?

+0

什麼URL導致重定向循環? –

+0

@JonLin所有網址 – Debiprasad

+0

它們在空白htaccess文件中都可以正常工作。你確定你的https重定向不缺少'www'嗎? –

回答

25

爲防萬一有人在使用Apache http-> https重寫負載均衡器後重定向循環,這裏有解決方案適用於我。

我在使用時出現同樣的問題當負載均衡器執行SSL內容時,對於負載均衡器後面的Apache,RewriteCond%{HTTPS}關閉

如果https版本的站點沒有通過Apache ModSSL配置,它不會將%{HTTPS}變量設置爲「on」並且無限次地重定向。

解決它的最簡單的解決方案是將所有https流量都映射到另一個Apache虛擬主機(當負載均衡器處理SSL時),這是主副本的副本,但具有不同的端口(可以說是81)。

ReWriteCond %{SERVER_PORT} !^81$ 
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L] 

做到這一點,第二個方法是從負載平衡器發送X - 轉發,原標題到Apache和重寫條件中使用它:和在.htaccess的不是81端口的一切需要的mod_rewrite

RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 
+2

耶,你是對的!我有同樣的問題。然而,我不能讓你的代碼工作,我用這個來代替: 'RewriteEngine On RewriteCond%{SERVER_PORT} 80 RewriteRule ^(。*)$ https://domain.com/$1 [R,L]' – Gabin

+2

感謝Konstantin,一直在尋找那個地方。 HTTP:X-Forwarded-Proto解決了它。 – JohnWolf

+0

爲我工作。太好了,非常感謝。 – Deus777

7

我已經看到很多人在嘗試使用.htaccess文件從http移動到https時遭受重定向循環。如何解決這個問題有很多不同的答案。有人說:

ReWriteCond %{SERVER_PORT} 80 
OR 
RewriteCond %{HTTPS} off 
OR 
RewriteCond %{HTTPS} !on 
OR (as above) 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
OR EVEN 
RewriteCond %{HTTP:X-Forwarded-SSL} =off 

但這些都沒有爲我工作。我最終發現了底層的事實,那裏的不同服務器以不同的方式配置,並且都提供了不同的服務器變量。

如果以上都不適合你,那麼訣竅就是使用PHP來查找當你訪問一個http頁面時你的特定服務器發送給你的env變量,以及當你訪問一個http頁面時發送給你的env變量https頁面,然後您可以使用該變量進行重定向。只需使用以下代碼在服務器上創建一個PHP文件(例如showphpvars.php):

<?php phpinfo() ?> 

然後用瀏覽器查看它。在它中查找帶有_SERVER [「HTTP_HOST」(etc)]的變量部分,並且爲http和https的變化找出一個變量。 Mine原來是一個名爲SSL的變量,在使用https時設置爲1,在使用http時不設置。

我使用該變量重定向到https與PHP,這是比使用htaccess更好,但我認爲,任何_SERVER變量也可以訪問使用htaccess,如果你渴望繼續使用。只需在引號內使用名稱,而不需要PHP添加的_SERVER [「」]位。

+0

[@ z-m](http://stackoverflow.com/users/4671199/z-m)中的罪魁禍首,真正有用的答案導致了我的個人解決方案。我只能推薦看看'phpinfo()'輸出。它可以爲您節省數小時的麻煩。獎勵! – twigmac

1

如果你得到一個重定向循環,不管你在htaccess中做什麼,而是在PHP中重定向。

我使用phpinfo(),就像@ z-m所示,找到當我在SSL上時發生變化的變量。在我的情況下,它是$ _SERVER ['HTTP_X_PROTO'] ==「https」。不在SSL上時,該變量未設置。

這是HTTPS我使用重定向代碼HTTP:

if ($_SERVER['HTTP_X_PROTO'] != "https") { 
    header("HTTP/1.1 301 Moved Permanently"); 
    $location = "https://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI]; 
    header("Location: $location"); 
    exit; 
    } 
+0

非常感謝代碼,大大的幫助! – daviddhont

1
RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{ 
+1

雖然此代碼可能回答此問題,但提供 有關_why_和/或_how_的其他上下文,它將回答 該問題將顯着改善其長期值 。請[編輯]你的答案,添加一些解釋。 –

+0

這一個爲我工作 – dexterslab

1

在我的情況是:

if ($_SERVER['HTTPS'] != "on") 
0

爲了您的信息,它實際上取決於您的主機提供商。它可能使用負載均衡器,正如Konstantin在另一個答案中所述。

在我的情況下(Infomaniak),沒有任何上述實際工作,我有無限的重定向循環。

做到這一點,正確的方法是actually explained in their support site

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule (.*) https://your-domain.com/$1 [R=301,L] 

所以,始終與您的託管服務提供商。希望他們有一篇文章解釋如何做到這一點。否則,只需要支持。