在.htaccess中整合冗余的RewriteCond线

时间:2014-06-08 20:49:47

标签: apache .htaccess mod-rewrite

我正在尝试合并.htaccess中的多个 RewriteCond 行,并且正在努力学习语法。这是我的.htaccess文件重定向区域的代码:

RewriteEngine On

# BEGIN page-level mobile redirects
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(index.html)?$ http://m.example.com [L,R=301]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^page-1/$ http://m.example.com/p1 [L,R=301]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^page-2/$ http://m.example.com/p2 [L,R=301]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^page-3/$ http://m.example.com/p3 [L,R=301]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^category/page-4/$ http://m.example.com/p4 [L,R=301]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^category/page-5/$ http://m.example.com/p5 [L,R=301]
</IfModule>
# END mobile redirects

上述解决方案正常工作但效率低下,因为有太多冗余的 ReWriteCond 行。我的目标是将一个 RewriteCond 行应用于我的所有 RewriteRule 行。这可能吗?

我通常会使用REQUEST_URI来更有效地完成此操作,但我无法在这种情况下因为我们重新编写多个类似桌面网站的请求而使用不同的 URL 布局到单个移动网站文件夹。

1 个答案:

答案 0 :(得分:0)

阅读Apache文档中的skip和last标志。您还可以使用正则表达式来折叠部分行:

# BEGIN page-level mobile redirects
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT}     !"android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile"
RewriteRule ^                       -                        [skip=3]
RewriteRule ^(index.html)?$         http://m.example.com     [L,R=301]
RewriteRule ^page-([123])/$         http://m.example.com/p$1 [L,R=301]
RewriteRule ^category/page-([45])/$ http://m.example.com/p$1 [L,R=301]
</IfModule>
# END mobile redirects
BTW,在运行时术语中考虑这一点是一种误解。是的,每个正则表达式/规则将增加10sμS,但性能方面的真正打击是需要打开并读取.htaccess文件,任何 .htaccess文件第一名。这样做是为了清晰和易于维护。只要你不太“聪明”地射击自己,规则越少,隐藏一些错误的可能性就越小。