使用变量来简化.htaccess文件中的mod_rewrite规则

时间:2014-06-27 15:46:56

标签: apache .htaccess mod-rewrite

我继承了一个.htaccess文件,其中包含一组非常复杂的mod_rewrite规则,大约有100行,其中包含大量重复内容:

RewriteCond %{REQUEST_URI} !^/(test|dev|((current|archive|all|2x|19|20|21|22|23|24|25|26|27)/([a-z]{2}|pt_br)))/favicon.ico
RewriteCond %{REQUEST_URI} !^/(test|dev|((current|archive|all|2x|19|20|21|22|23|24|25|26|27)/([a-z]{2}|pt_br)))/robots.txt
RewriteRule ^(test|dev|((current|archive|all|2x|19|20|21|22|23|24|25|26|27)/([a-z]{2}|pt_br)))/(.*) /index.php?title=$5 [L,QSA,S=1]

(请注意,这些规则确实存在细微的差异,并且都没有相同,但它们之间的组成部分是一致的。)

我想使用变量来使这些规则更易于维护,这可能吗?这个伪示例中的一些东西:

# define variables
versions=(current|archive|all|2x|19|20|21|22|23|24|25|26|27)
languages=(current|archive|all|2x|19|20|21|22|23|24|25|26|27)
# body of rules
RewriteCond %{REQUEST_URI} !^/(test|dev|($versions/$languages))/favicon.ico
RewriteCond %{REQUEST_URI} !^/(test|dev|($versions/$languages))/robots.txt
RewriteRule ^(test|dev|($versions/$languages)/(.*) /index.php?title=$5 [L,QSA,S=1]

1 个答案:

答案 0 :(得分:0)

那么你不能在这样的变量中存储部分正则表达式。

作为一种解决方法,如果满足以下条件,则可以设置env变量:

RewriteRule (current|archive|all|2x|19|20|21|22|23|24|25|26|27) - [E=VERSION:$1]

RewriteRule (current|archive|all|2x|19|20|21|22|23|24|25|26|27) - [E=LANG:$1]

完成后,您可以在条件中使用这些环境变量:

RewriteCond %{ENV:VERSION} .+

OR

RewriteCond %{ENV:LANG} .+