.htaccess基于顶级域名设环境变量后后续代码不执行问题
解决.htaccess中块导致后续代码无法执行的问题
嘿,我正好踩过类似的坑!你用
问题根源
你的代码里,RewriteRule .* - [E=_rootfolder_:xxx]虽然没加L(终止后续规则)标记,但Apache会把
最优解决方案:用SetEnvIf替代块
SetEnvIf是Apache专门用来根据请求头(比如Host)设置环境变量的指令,语法简洁,而且完全不会影响后续规则的执行。替换后的代码如下:
# 根据Host匹配结果设置_rootfolder_ SetEnvIf Host "^(domain\.com|localhost)$" _rootfolder_=www.domain.com SetEnvIf Host "^domain\.de$" _rootfolder_=www.domain.de # 全局设置_rooturl_(不受Host影响,始终执行) SetEnv _rooturl_ domainname # 这里放你后续的重定向或其他规则 # (...)
为什么这个方案靠谱?
- SetEnvIf是独立的变量设置指令,不参与URL重写流程,只是单纯给请求绑定环境变量
- 所有指令按顺序依次执行:不管Host是否匹配,
_rooturl_都会被正常设置;_rootfolder_则根据Host匹配结果覆盖(规则顺序符合你的需求,不会出现冲突)
备选方案:用RewriteCond+RewriteRule替代块
如果你更习惯用Rewrite系列指令,也可以把
# 匹配domain.com或localhost,设置_rootfolder_ RewriteCond %{HTTP_HOST} ^(domain\.com|localhost)$ RewriteRule ^ - [E=_rootfolder_:www.domain.com] # 匹配domain.de,设置_rootfolder_ RewriteCond %{HTTP_HOST} ^domain\.de$ RewriteRule ^ - [E=_rootfolder_:www.domain.de] # 全局设置_rooturl_ RewriteRule ^ - [E=_rooturl_:domainname] # 后续重定向规则 # (...)
注意细节
这里的RewriteRule ^ -是匹配空路径(等价于所有请求),仅用来设置环境变量,不会修改URL,也不会终止后续规则(没有L标记),所以后续的重定向逻辑会正常执行。
验证方法
你可以在PHP文件里加一行代码测试变量是否正常设置:
<?php echo $_SERVER['_rootfolder_'] . ' | ' . $_SERVER['_rooturl_']; ?>
切换不同Host访问,就能看到两个变量是否都能正确输出。
内容的提问来源于stack exchange,提问作者Demiën Drost
相关产品推荐
相关产品推荐

