簡體   English   中英

.htaccess文件沒有重定向http:// www。 到https:// www

[英].htaccess file not redirecting http://www. to https://www

我制作了一個.htaccess文件,將所有網站流量重定向到https://www.

這是我完整的.htaccess文件:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

以下重定向完全按預期工作:

http://example.com -> https://www.example.com
https://example.com -> https://www.example.com
https://www.example.com -> https://www.example.com

除了:

http://www.example.com -> http://www.example.com

如上所示,如果你去http://www. 它不會重定向到HTTPS版本。

誰能幫助我理解為什么其他重定向工作正常,但那個不是?

附加說明: 我已經查看了StackOverflow上的一些帖子,但他們的大部分解決方案都以重定向循環錯誤結束。

在聯系123-Reg(我的托管服務提供商)后,他們提交了此解決方案,該解決方案完美運行:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

基本上他們已經將腳本設置為執行兩項任務:將域更改為WWW ,如果尚未更改,則更改為HTTPS 此外,他們使用ENV:HTTPS ,這與他們的文檔( ENV:SSL )中的內容不同。

很高興有這個排序,也許這將幫助其他人使用123-Reg Hosting。

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\\.example\\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

如您www.example.com ,無論是HTTP還是HTTPS,在請求規范主機名(即www.example.com )時都不會重定向。

您需要將其更改為:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

如果HTTPS“關閉” 或者它不是規范主機名,這將觸發重定向到規范URL。

...但他們的大多數解決方案都以重定向循環錯誤結束。

如果您在管理SSL證書的代理(例如CloudFlare)后面,那么這仍然可能導致重定向循環,因為您和代理之間的連接可能是HTTP,而不是HTTPS。 這意味着您的服務器僅通過HTTP提供內容,而不是HTTPS。 如果是這種情況,則可以在請求中檢查其他標頭(例如, X-Forwarded-Proto )或在CloudFlare(靈活SSL - 免費服務)的情況下設置“頁面規則”。


更新#1: 123-Reg提供有關SSL的幫助文檔 當“連接受SSL保護”時,它們似乎設置了SSL環境變量。 這意味着您可能會執行以下操作:

RewriteCond %{ENV:SSL} ^$ [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

然而,這是123-Reg的非標准和“獨特”。 旁白: 123-Reg鏈接文檔中的PHP代碼建議不是檢查環境變量的推薦方法,因為如果未設置變量,這將導致E_NOTICE!?)

您還應確保在測試之前清除瀏覽器緩存。

更新#2:為了幫助調試...找出返回的值,可以將一些Apache值分配給環境變量,並在服務器端腳本中檢查這些值(例如PHP?)。 例如:

RewriteCond %{HTTPS} (.*)
RewriteRule ^ - [E=APACHE_HTTPS:%1]

# You don't really need this, but for completeness...
RewriteCond %{ENV:SSL} (.*)
RewriteRule ^ - [E=APACHE_SSL:%1]

RewriteCond %{HTTP:X-Forwarded-Proto} (.*)
RewriteRule ^ - [E=APACHE_PROTO:%1]

然后檢查服務器端腳本中的環境變量APACHE_HTTPSAPACHE_SSLAPACHE_PROTO (例如,在PHP中,使用getenv()函數。)

經過123 Reg的許多問題並使用Wordpress將所有版本的頁面重定向到單個相關的https頁面,這就是我現在在多個站點上工作的東西,並且已經證明在SEO方面是有效的。 希望能幫助到你!

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM