簡體   English   中英

.htaccess 使用 SSL/HTTPS 將 www 重定向到非 www

[英].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

http://example.com

http://www.example.com

https://www.example.com

https://example.com

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。

要在單個請求中強制使用非 wwwhttps ,您可以在 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] 中:

  1. L = 如果規則已處理,則不再處理。
  2. 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.

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