[英].htaccess redirect www to non-www with SSL/HTTPS
我有多個域在單個.htaccess
文件下運行,每個域都有一個 SSL 證書。
我需要在每個域上強制使用https
前綴,同時還要確保www
版本重定向到no-www
www
版本。
下面是我的代碼; 它不起作用:
RewriteCond %{HTTP_HOST} ^www.%{HTTP_HOST}
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI}/$1 [R=301,L]
我想要實現的是:將類似https://www.example.com
重定向到https://example.com
。
我做錯了什么,我該如何實現?
www 到非 www 與 https
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
參考: Apache 將 www 重定向到非 www 並將 HTTP 重定向到 HTTPS
到
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
如果您希望默認 URL 不是example.com,而是www.example.com ,那么只需更改第三行和第五行:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
你的條件永遠不會成立,因為它就像“if (a == a + b)”。
我會嘗試以下方法:
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]
這會將“google.com”從“www.google.com”捕獲到 %1,其余的在 $1 中,然后在 HTTP_HOST 以 www 開頭(帶或不帶 https)時組合 2。
要在單個請求中強制使用非 www和https ,您可以在 htaccess 中使用以下規則:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\. [OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]
這會將http://www.example.com/或https://www.example.com/重定向到 ssl 非 www https://example.com/ 。
我使用R Temp Redirect 標志進行測試並避免瀏覽器緩存。 如果您想讓重定向永久生效,只需將R標志更改為R=301 。
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
這對我來說完美無缺!
證書必須涵蓋 www 和非 www https。 某些提供商的證書涵蓋 www.xxxx.yyy 的兩種證書,但 xxxx.yyy 的證書僅涵蓋一種。
開啟重寫:
RewriteEngine On
使所有 http 使用 https:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301]
只讓 www https 使用非 www https:
RewriteCond %{SERVER_PORT} 443
RewriteCond %{HTTP_HOST} ^www[.].+$
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301]
不能處理非 www https,否則會發生循環。
在 [L,R=301] 中:
更通用
一種更通用的方法——不依賴於端口——是:
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]
使任何帶有www
url 刪除它。
RewriteCond %{HTTPS} !on
RewriteCond %{HTTPS} !1
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]
要強制任何非 https url,即使對於那些從負載均衡器下游刪除 https 的系統,請使用 https。
請注意,我還沒有測試過forwarded
選項,因此如果您對它們的任何問題提供反饋,我們將不勝感激。 如果您的系統不在負載平衡器后面,則可以省略這些行。
TO HTTP_HOST 與否
您可以使用${HTTP_HOST}
作為RewriteRule
URL 的一部分,或者您可以使用明確的規范域名文本(上面的xxxx.yyy
)。
明確指定域名可確保在用戶提供的 URL 中不會使用輕微的字符彎曲手段來誘使您的網站做一些它可能沒有准備好的事情,或者至少確保出現正確的域名在地址欄中,無論打開頁面的是哪個 URL 字符串。
它甚至可能有助於轉換 punycode 編碼的域以在地址欄中顯示正確的 unicode 字符。
這對我有用:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
經過多次反復試驗,這對我有用。 第一部分來自上面的用戶,將捕獲 www.xxx.yyy 並發送到https://xxx.yyy
第 2 部分查看輸入的 URL 並檢查是否為 HTTPS,如果不是,則發送到 HTTPS
按此順序完成,它遵循邏輯並且不會發生錯誤。
這是我在 WordPress 側面 htaccess 中的完整版本:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
對我來說,將“example.com”硬編碼為字符串更好,所以我需要更少的規則,即使您也可以使用它從 .org 重定向到 .com 或類似內容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
</IfModule>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.