Dot-Htaccess
我如何 301 將某些特定 URL(包括根目錄)重定向到特定位置,然後將其他所有內容重定向到新根目錄?
我正在努力應對 .htaccess mod_rewrite 挑戰。幫助表示讚賞。
我希望以下 301 重定向工作:
- mysite.com > https://newsite.com/subdirectory/
- mysite.com/old_page_1/ > https://newsite.com/subdirectory/new_page_1/
- mysite.com/old_page_2/ > https://newsite.com/subdirectory/new_page_2/
- mysite.com/old_page_3/ > https://newsite.com/subdirectory/new_page_3/
- mysite.com/anything_else > https://newsite.com/anything_else
我正在為訂單或其他事情而苦苦掙扎。這是我的程式碼:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^/?old_page_1/? https://newsite.com/subdirectory/new_page_1/ [R=301,L] RewriteRule ^/?old_page_2/? https://newsite.com/subdirectory/new_page_2/ [R=301,L] RewriteRule ^/?old_page_3/? https://newsite.com/subdirectory/new_page_3/ [R=301,L] RewriteRule ^/? https://newsite.com/subdirectory/ [R=301,L] RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$ RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L] </IfModule>
前 4 次重寫工作,但之後的 any_else 部分被第 4 次重寫破壞。
RewriteRule ^/? https://newsite.com/subdirectory/ [R=301,L]
因為正則表達式
^/?
匹配一切。您沒有字元串結尾的錨點,因此上面的內容匹配 URL 路徑開頭的可選/
內容,後跟任何內容。這同樣適用於前面的規則——儘管這可能不是問題。請注意,在 中,模式
.htaccess
匹配的 URL 路徑從不以斜杠開頭,因此可以刪除前綴。RewriteRule
/?
不需要
<IfModule>
包裝器,除非您打算在 mod_rewrite 可能不可用時在多個伺服器上重用相同的程式碼,並且您仍然希望舊站點按原樣執行(我不太可能認為)。RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$ RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]
您正在檢查最後一條規則中的請求
Host
,但沒有在前面的規則中檢查?新舊“域”是指向同一個地方還是不同的伺服器?如果新站點上不存在舊 URL,這可能並不重要,儘管您正在 301(永久)重定向文件根目錄?請注意,您應該首先使用 302(臨時)重定向進行測試,並且只有在您確定它工作正常時才更改為 301。301 被瀏覽器永久記憶體 - 包括任何錯誤的重定向。
請嘗試以下操作:
RewriteEngine On RewriteRule ^old_page_1/?$ https://newsite.com/subdirectory/new_page_1/ [R=302,L] RewriteRule ^old_page_2/?$ https://newsite.com/subdirectory/new_page_2/ [R=302,L] RewriteRule ^old_page_3/?$ https://newsite.com/subdirectory/new_page_3/ [R=302,L] RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com RewriteRule ^$ https://newsite.com/subdirectory/ [R=302,L] RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com RewriteRule (.*) https://newsite.com/$1 [R=302,L]
請注意,我刪除了CondPattern上檢查標頭的尾隨
$
(字元串結尾錨點),以便擷取以點結尾的 FQDN。Host
您需要在測試前清除瀏覽器記憶體。