![多個條件重定向全部在一個 .htaccess(登陸頁)中](https://rvso.com/image/770104/%E5%A4%9A%E5%80%8B%E6%A2%9D%E4%BB%B6%E9%87%8D%E5%AE%9A%E5%90%91%E5%85%A8%E9%83%A8%E5%9C%A8%E4%B8%80%E5%80%8B%20.htaccess%EF%BC%88%E7%99%BB%E9%99%B8%E9%A0%81%EF%BC%89%E4%B8%AD.png)
我有一個資料夾,裡面只有一個「即將推出」的單頁 html。
然後,我有幾個網域,根據需要時不時地指向該資料夾。
簡單吧?
好吧,我想要的是一個條件,如果原始請求的頁面不是 www,請前往 www (301> 加上如果不是 https,請前往 https (301),然後將所有流量重定向到https://www.originating-domain.xzy/index.html
(302)
目的是讓它成為一個用於多種用途的登陸頁面,但總是 301 到https://www
,然後 302 到index.html
我已經在每個網站上使用了非 www 到 www 和 http 到 https 的工作:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
現在我想將 302 臨時重定向添加到index.html
.
或者有沒有更好的方法來完全做到這一點?就像因為這都是暫時的...... 302 所有流量都到索引我嘗試了這個但沒有用
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
答案1
RewriteCond %{REQUEST_URI} !.*index\.html RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
這有幾個問題......
您似乎缺少
RewriteRule
圖案(第一個參數)完全正確,因此該指令將無法匹配。如果確實匹配,它將為
www.
子網域添加前綴再次。我假設您正在放置此重定向後規範重定向(HTTP 到 HTTPS,非 www 到 www)—正如你應該的那樣。因此,這將重定向到https://www.www.example.com/index.html
,因為觸發此重定向時,主機名稱已經是規範的。
這狀態(RewriteCond
指令) 並不是真正需要的,因為該檢查(/index.html
尚未請求)可以由指令本身更有效地處理RewriteRule
。
例如:
RewriteRule !^index\.html$ /index.html [R=302,L]
無需在其中包含方案+主機名代換字串,因為無論如何您都想重定向到相同的字串。如果你想明確一點,你可以這樣寫https://%{HTTP_HOST}/index.html
。
請注意,就目前情況而言,index.html
不能引用任何其他當地的資源(圖像、CSS、JavaScript 等),因為這些請求也會被重新導向。若要允許存取本機資源,您需要新增幾個條件來排除對靜態資源的請求。
RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]
或者,將這些資源託管在外部網域上。 (或在子目錄中並排除整個子目錄。)
但是,如果選擇“重定向”,我可能會重定向到更獨特/更有意義的命名文件,例如。/coming-soon.html
。使用的問題/index.html
是,如果您稍後想要在該 URL 上提供不同的內容,並且該內容已被快取(無論出於何種原因)。雖然/coming-soon.html
可能應該是“noindex”。
然而,最好不要重定向,而是提供一個暫時的“503 服務不可用”回應。看我的答案有關詳細信息,請訪問網站管理員堆疊上的以下問題:
在旁邊:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
您是否使用管理 SSL 連線的前端代理?
如果是的話那就沒問題,儘管檢查HTTPS
伺服器變數的第二個條件因此是多餘的。但是,如果您是不是X-Forwarded-Proto: https
如果在 SSL 代理程式後面,如果將標頭注入到請求中,則這些指令很容易被繞過(即使用者不會重新導向到 HTTPS)。
更新:
好的,這按我想要的方式工作。但我可以以某種方式將它們結合起來嗎?
RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
如上所述,最後一條規則本質上與以下規則相同(當與前面的規範重定向結合使用時),它更簡單、更有效率:
RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]
在第二條規則中,您也應該更改RewriteRule
圖案從^(.*)$
到^
(與第一條規則相同)。^(.*)$
不必要地捕獲反向引用並且效率較低。
您在先前的評論(現已刪除)中提到您希望它也適用於任何子網域。它適用於任何子域,但是,它總是會在前面添加一個額外的www
子域,這可能是也可能不是所需的? (通常不會有www
子域子域。 YMMV。
沒有真正需要「組合」這些規則。如果您想在 302 重定向到「即將推出」頁面之前先 301 重定向到 www+HTTPS,那麼您當然不能將它們組合起來。雖然前兩個規則(301 重定向)可以「組合」為單一規則,但它沒有任何作用。
這裡唯一的小問題是可能(最多)有 2 個重定向。首先,在原始 URL 路徑上透過 301 造訪 www+HTTPS,然後透過 302 造訪「即將推出」頁面。
我會質疑當您將用戶重定向到某個網站時,您是否真的需要初始 301 重定向到 www+HTTPS暫時的“即將推出”頁面。一旦您實現了新網站(取代「即將推出」頁面),您就可以實現規範重定向。 302重定向仍然可以重定向到www+HTTPS。 (但是,/coming-soon.html
直接請求時存在一種邊緣情況。)
例如:
# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]
# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS
# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
任何請求http://example.com/foo
都會被 302 直接重定向到https://www.example.com/coming-soon.html
.
如果http://example.com/coming-soon.html
應該請求,則將其 301 重新導向至https://www.example.com/coming-soon.html
(僅修復 HTTPS 和 www 子網域)。
最多只有 1 個外部重定向。
答案2
好的,這按我想要的方式工作。但我可以以某種方式將它們結合起來嗎?
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]