我是 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 需要重定向
这是正确的方法吗?或者可以使规则更加优化?
答案1
这是正确的方法吗……?
嗯,可能是这样,但是你并没有真正解释清楚你在做什么以及为什么这样做。
- 为什么需要检查
HTTP_HOST
;您是否有多个域? - 将多个(看似不相关的)URL 重定向到一个 URL 看起来有点奇怪。旧网站没有规范 URL 吗?
- 你需要不区分大小写的匹配?
- 您没有转义正则表达式中的所有点。
您没有在
RewriteRule
模式中使用捕获组;因此不需要捕获组。即(.*)
应该只是.*
。(捕获组/括号子模式需要由正则表达式解析器存储,因此如果不使用它们就浪费了。)您的示例有较短的 URL,但尽可能多地匹配会更有效率
RewriteRule
图案,而不是REQUEST_URI
匹配状况。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
。但是,不要混合使用两个模块的重定向,因为您可能会得到意想不到的结果。(不同的模块在请求期间会在不同的时间运行,尽管它们在配置文件中的顺序似乎不同。)