Dot-Htaccess

我如何 301 將某些特定 URL(包括根目錄)重定向到特定位置,然後將其他所有內容重定向到新根目錄?

  • June 17, 2020

我正在努力應對 .htaccess mod_rewrite 挑戰。幫助表示讚賞。

我希望以下 301 重定向工作:

  1. mysite.com > https://newsite.com/subdirectory/
  2. mysite.com/old_page_1/ > https://newsite.com/subdirectory/new_page_1/
  3. mysite.com/old_page_2/ > https://newsite.com/subdirectory/new_page_2/
  4. mysite.com/old_page_3/ > https://newsite.com/subdirectory/new_page_3/
  5. 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

您需要在測試前清除瀏覽器記憶體。

引用自:https://serverfault.com/questions/1021921