优化 301 重定向的 httpd 重写规则

优化 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 需要重定向

这是正确的方法吗?或者可以使规则更加优化?

答案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。但是,不要混合使用两个模块的重定向,因为您可能会得到意想不到的结果。(不同的模块在请求期间会在不同的时间运行,尽管它们在配置文件中的顺序似乎不同。)

相关内容