Apache-2.2
優化 301 重定向的 httpd 重寫規則
我是 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_URI
在conditions中匹配更有效。模式首先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_alias
Redirect
和/或RewriteMatch
代替會“更優化”。但是,不要混合來自兩個模組的重定向,因為您可能會得到意想不到的結果。(不同的模組在請求期間在不同的時間執行,儘管它們在配置文件中的順序很明顯。)