Apache-2.2

優化 301 重定向的 httpd 重寫規則

  • December 1, 2016

我是 apache 重寫規則的新手;我正在編寫 301 重定向規則,用於將舊站點的頁面重定向到新站點。請在下面找到規則-

#1
RewriteCond %{HTTP_HOST} ^(www-stage\.)?newsite\.com.au$ [NC]
RewriteCond %{REQUEST_URI} ^/a/b/c.html$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/x/y/z.html$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/p/q/r.html$ [NC]
RewriteRule (.*) /f/g/h.html [L,R=301]

#2
RewriteCond %{HTTP_HOST} ^(www-stage\.)?newsite\.com.au$ [NC]
RewriteCond %{REQUEST_URI} ^/q/w.html$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/i/n/s.html$ [NC]
RewriteRule (.*) /s/d/f/g.html [L,R=301]

對於每個新頁面;我首先匹配域;並匹配所有舊頁面的 URL 並重定向到新頁面的 URL。大約有 120-130 個 URL 需要重定向

這是正確的方法嗎?或者規則可以更優化?

這是正確的方法嗎…?

嗯,它可能是,但你並沒有真正準確地解釋你在做什麼以及為什麼你要這樣做。

  • 為什麼需要檢查HTTP_HOST; 你有多個域嗎?
  • 將多個(看似不相關的)URL 重定向到單個 URL 看起來有點奇怪。舊網站沒有規範的網址嗎?
  • 需要不區分大小寫的匹配嗎?

  • 你沒有逃避正則表達式中的所有點。
  • 您沒有在RewriteRule模式中使用擷取的組;所以不需要擷取組。IE。(.*)應該只是.*。(擷取組/帶括號的子模式需要由正則表達式解析器儲存,因此如果不使用它們是一種浪費。)
  • RewriteRule 您的範例具有短 URL,但在pattern中盡可能多地匹配會比REQUEST_URIconditions中匹配更有效。模式首先RewriteRule被處理,只有當這個匹配時前面的RewriteCond指令才被處理。在模式中使用匹配所有內容的萬用字元(即。(.*))會導致每個規則都被處理。RewriteRule

因此,上述重定向可以重寫(優化)為(暫時忽略域檢查並假設NS不需要):

#1
RewriteRule ^/(a/b/c|x/y/z|p/q/r)\.html$ /f/g/h.html [R=301,L]

#2
RewriteRule ^/(q/w|i/n/s)\.html$ /s/d/f/g.html [R=301,L]

再說一次,如果您還沒有將 mod_rewrite 用於其他事情,那麼使用 mod_aliasRedirect和/或RewriteMatch代替會“更優化”。但是,不要混合來自兩個模組的重定向,因為您可能會得到意想不到的結果。(不同的模組在請求期間在不同的時間執行,儘管它們在配置文件中的順序很明顯。)

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