Apache 將除一個之外的任何子網域重寫為非 www https

Apache 將除一個之外的任何子網域重寫為非 www https

我正在嘗試減少伺服器上 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]

我目前的實作有三個問題:

  1. 一個請求http://www.example.net將有兩個重定向。

  2. 與本網站上的大多數 www 到非 www 重定向範例一樣,它不會重定向ww.wwww.因此我的分析有許多未重定向的錯誤輸入的子網域。

  3. 我想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相同內容(以便存取HostHTTP 請求標頭),以防這是負載平衡器的要求?否則,這裡更常見的是使用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]
  1. 向條件添加了NC( nocase) 標誌X-Forwarded-Proto,因為它的值似乎不區分大小寫,即HTTP = Http = hTTp = http。您可以隨意刪除它。
  2. 在條件中加入了NV( novary) 標誌X-Forwarded-Proto以將其隱藏在Vary回應標頭中。同樣,您可以隨意刪除它,特別是如果情況並非如此(反向代理在將其發送到客戶端之前會自動為您過濾它)或需要正確的快取行為(快取不會以其他方式區分httphttps內容) 。
  3. 在標頭條件中加入了NV( novary) 標誌Host,以將其隱藏在Vary回應標頭中。如果您的快取伺服器損壞,您也可以刪除它。
  4. 使RewriteRule標誌順序一致(L,R=301並且R=301,L本質上相同)。
  5. 阻止www.example.net.but.not.actually.yours.com被識別,但仍然允許例如www.example.net:443
  6. 始終用作%{REQUEST_URI}替代品。
  7. 還認wwwwww

相關內容