
我正在嘗試減少伺服器上 301 重定向連結的數量,因此我想將子網域到非 www 重新導向(子網域所在的位置除外dev
)與 HTTP 到 HTTPS 重新導向(使用%{HTTP:X-Forwarded-Proto}
)結合起來,因為實例位於後面負載平衡器。
這是我到目前為止所擁有的.htaccess
:
# move http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
# Remove leading www
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]
我目前的實作有三個問題:
一個請求
http://www.example.net
將有兩個重定向。與本網站上的大多數 www 到非 www 重定向範例一樣,它不會重定向
ww.
,wwww.
因此我的分析有許多未重定向的錯誤輸入的子網域。我想
dev.
從重定向中排除子域,sohttp://dev.example.net
及其https
同級域,因為我用於dev.
開發和發布階段。
我應該如何結合這個?
答案1
1) 一個請求
http://www.example.net
將有兩個重定向。
只需顛倒這兩個規則即可解決此問題。然後www.example.net
在第一次重定向中重定向到HTTPS,因此HTTP到HTTPS重定向不需要觸發。
(但是,這假設您無意實施HSTS- 在這種情況下,您需要將它們保留為兩個重新導向,因為重新導向到相同主機名稱上的 HTTPS第一的是一個要求。
2) 像本網站上的大多數 www 到非 www 重定向範例一樣,它不會重定向
ww.
,wwww.
因此我的分析有很多未重定向的錯誤輸入的子網域。
ww.
通常,對子網域的請求wwww.
根本無法解析,因此這通常不是問題。為此,您必須配置一個通配符DNS 中的子網域並將伺服器設定為接受此類請求。
^www\.
但這可以透過將正規表示式(片段)從修改為來解決^w{2,4}\.
。
3) 我想
dev.
從重定向中排除子域,sohttp://dev.example.net
及其https
同級域,因為我用於dev.
開發和發布階段。
這僅適用於 HTTP 到 HTTPS 規則,因此可以在此處應用附加條件來排除以dev.
.
將以上幾點結合起來,試試以下操作:
# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]
# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]
我保留了您使用的HTTP:Host
相同內容(以便存取Host
HTTP 請求標頭),以防這是負載平衡器的要求?否則,這裡更常見的是使用HTTP_HOST
伺服器變數。
!
上的前綴條件模式(即。 )否定正規表示式,因此當執行!^dev\.
時條件成功Host
不是從...開始dev.
。 (我想www.dev.
這不是一件事嗎?)
(.*)
^(.*)$
與預設正規表示式是貪婪的相同。
在測試之前您需要清除瀏覽器快取。建議先使用 302(暫時)重定向進行測試,以避免任何快取問題。
答案2
# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV]
RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301]
# move http to https, except for dev.example.net
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV]
RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- 向條件添加了
NC
(nocase
) 標誌X-Forwarded-Proto
,因為它的值似乎不區分大小寫,即HTTP = Http = hTTp = http
。您可以隨意刪除它。 - 在條件中加入了
NV
(novary
) 標誌X-Forwarded-Proto
以將其隱藏在Vary
回應標頭中。同樣,您可以隨意刪除它,特別是如果情況並非如此(反向代理在將其發送到客戶端之前會自動為您過濾它)或需要正確的快取行為(快取不會以其他方式區分http
和https
內容) 。 - 在標頭條件中加入了
NV
(novary
) 標誌Host
,以將其隱藏在Vary
回應標頭中。如果您的快取伺服器損壞,您也可以刪除它。 - 使
RewriteRule
標誌順序一致(L,R=301
並且R=301,L
本質上相同)。 - 阻止
www.example.net.but.not.actually.yours.com
被識別,但仍然允許例如www.example.net:443
。 - 始終用作
%{REQUEST_URI}
替代品。 - 還認
ww
和wwww
。