如何在Apache中按URL设置不同HTTP头?配置失效求助
修复Apache Header配置的两个问题
嘿,我来帮你搞定这两个配置问题,咱们一步步来:
问题1:Test-1显示(null)
你用了%{THE_REQUEST}e来引用变量,但这里的e后缀是用来读取系统环境变量的(比如%{HOME}e这种),而THE_REQUEST是Apache自己的内部请求变量,根本不是环境变量,所以才会返回(null)。
要正确获取THE_REQUEST的值,直接去掉e后缀就行,它会自动识别这是Apache的内部变量。
问题2:访问/en时Test-2依然被设置
你的<If>条件用了!=运算符,但在Apache 2.4的表达式语法里,字符串比较得用专门的字符串运算符:eq(等于)、ne(不等于)。!=是给数值比较用的,当你拿它比字符串时,Apache会强行把两边转成数值(非数字字符串都会被当成0),结果就是0 != 0,这逻辑肯定不对,导致条件判断失效,Test-2就被错误设置了。
修复后的完整配置
把你的配置改成这样:
# 正确引用THE_REQUEST内部变量,设置Test-1 Header set Test-1 "%{THE_REQUEST}" # 使用字符串不等于运算符ne,确保访问/en时不触发Test-2 <If "%{REQUEST_URI} ne '/en'"> Header set Test-2 "%{REQUEST_URI}" </If>
额外小提示
- 如果你的需求是排除所有以
/en开头的路径(比如/en/about、/en/contact),可以改用正则表达式匹配,更灵活:<If "%{REQUEST_URI} !~ m#^/en(/.*)?$#"> Header set Test-2 "%{REQUEST_URI}" </If> - 别忘了确认Docker里的Apache已经启用了
mod_headers和mod_expr模块——大部分官方Debian Apache镜像默认都开了,但如果还是没生效,可以检查httpd.conf里有没有这两行:LoadModule headers_module modules/mod_headers.so LoadModule expr_module modules/mod_expr.so
内容的提问来源于stack exchange,提问作者Eakkapat Pattarathamrong
相关产品推荐
相关产品推荐

