我的 .htaccess 檔案是:
# remove "www"
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
# add trailing slash "/"
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteRule ^(.*(?:^|/)[^/\.] )$ $1/ [R=301,L]
# other rules needed
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteRule ^old-link/$ https://example.com/new-link/ [R=301,L]
有了這個,我的目標是使http://www.example.com/something-after重定向到https://example.com/something-after 之后我希望在末尾添加“/”:https:// example.com/something-after/
但是,我已經在在線測驗器中對此進行了測驗,它說第一條規則上的“測驗已停止,使用不同的主機將導致重定向”,因此第二條規則從未滿足。
uj5u.com熱心網友回復:
我已經在在線測驗器中對此進行了測驗,它說第一條規則上的“測驗已停止,使用不同的主機將導致重定向”,因此第二條規則從未得到滿足。
大多數在線測驗人員僅通過指令進行一次(在單個請求中)。在真實服務器上,可能會發生多次傳遞(和多次請求)。
這些指令并沒有真正的問題,只是它可能會觸發多個重定向。例如。一個請求https://www.example.com/foo將觸發兩個外部重定向。第一個 to https://example.com/foo(洗掉 www)和第二個 to https://example.com/foo/(附加斜杠)。在極端情況下,對https://www.example.com/old-link(無斜杠)的請求將觸發三個外部重定向。
可以通過簡單地重新排序規則并在重定向中顯式包含方案 主機名以附加尾部斜杠(當前是第二條規則)來避免這些多次重定向,就像您在其他兩條規則中所做的那樣。此外,允許在/old-link/規則上使用可選的尾部斜杠。
例如:
# Specific redirects
RewriteCond %{HTTP_HOST} ^(?:www\.)?(example\.com) [NC]
RewriteRule ^old-link/?$ https://%1/new-link/ [R=301,L]
# Add trailing slash "/"
RewriteCond %{HTTP_HOST} ^(?:www\.)?(example\.com) [NC]
RewriteRule ^(.*(?:^|/)[^/\.] )$ https://%1/$1/ [R=301,L]
# Remove "www"
RewriteCond %{HTTP_HOST} ^www\.(example\.com) [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
現在,只需要處理一個規則。移除 www、附加斜杠和重定向/old-link都由一條規則處理。
其他小改動:
- 我在CondPattern 中捕獲了域并
%1在替換字串中使用了反向參考。這只是省去了在替換字串中顯式重復域名的麻煩。 $從CondPattern 中洗掉(字串結尾錨點)以允許以點結尾的 FQDN。NC向RewriteCond指令添加了標志。(機器人可能會請求混合大小寫的Host標頭。)
但是,這里的另一個問題是您目前沒有從 HTTP 到 HTTPS 的重定向。您可以將其添加為最后一條規則:
# Redirect HTTP to HTTPS
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
這只是一個標準的 HTTP 到 HTTPS 重定向,假設 SSL 證書直接安裝在應用程式服務器上。
通過將規則放在最后,您只需要檢查example.com(而不是www.example.com),因為請求必須已經被前面的規則(如果需要)規范化(以洗掉 www 子域)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/371381.html
