如何为所有RewriteRule配置统一Httacees RewriteCond,避免重复编写?
为多条RewriteRule共享RewriteCond的可行方案
完全可行,你可以通过以下两种方式避免重复编写相同的RewriteCond:
方法1:使用Apache 2.4+的<If>容器
将所有需要应用该主机头条件的RewriteRule包裹在<If>指令中,一次性定义匹配条件即可:
<If "%{HTTP_HOST} !~ /^www\.domain\.com$/i && %{HTTP_HOST} =~ /^([a-zA-Z0-9]+)\.domain\.com$/i"> RewriteRule ^$ /index.php?sub_domain=%1 [L,QSA] RewriteRule ^login$ /login.php?sub_domain=%1 [L,QSA] RewriteRule ^signup$ /signup.php?sub_domain=%1 [L,QSA] </If>
- 这里的
i修饰符等价于RewriteCond的[NC](忽略大小写) - 仅适用于Apache 2.4及以上版本,语法更简洁直观
方法2:通过环境变量传递匹配结果(兼容Apache 2.2+)
先通过一组RewriteCond/RewriteRule捕获子域名并设置环境变量,后续规则只需判断该环境变量是否存在即可:
# 匹配非www的子域名,设置环境变量SUB_DOMAIN RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.domain\.com$ [NC] RewriteRule ^ - [E=SUB_DOMAIN:%1] # 后续规则复用环境变量 RewriteCond %{ENV:SUB_DOMAIN} !="" RewriteRule ^$ /index.php?sub_domain=%{ENV:SUB_DOMAIN} [L,QSA] RewriteCond %{ENV:SUB_DOMAIN} !="" RewriteRule ^login$ /login.php?sub_domain=%{ENV:SUB_DOMAIN} [L,QSA] RewriteCond %{ENV:SUB_DOMAIN} !="" RewriteRule ^signup$ /signup.php?sub_domain=%{ENV:SUB_DOMAIN} [L,QSA]
- 这种方法兼容更早的Apache版本,通过环境变量传递捕获的子域名值,避免重复编写主机头匹配规则
内容的提问来源于stack exchange,提问作者sami eisa
相关产品推荐
相关产品推荐

