我正在使用 Apache 2.4.6
我想检查请求中是否存在自定义标头 X-CUSTOM-HEADER,如果是,则将相同的标头和相同的值设置为响应。如果请求中不存在该标头,则将响应标头设置为随机值。
我无法从请求标头读取并设置与响应标头相同的值。
#******* THIS CODE DOES NOT WORK ********
Header set X-CUSTOM-HEADER %{req:X-CUSTOM-HEADER}e "expr=%{req:X-CUSTOM-HEADER} != ''"
我也尝试过使用“SetEnv”和“Define”来读取并将标头值设置为变量,然后在设置响应标头时使用该变量,但这也不起作用。
如果未预设标题,我将使用 mmod_unique_id 模块来设置唯一值。
****** THIS CODE WORKS *******
Header set X-CUSTOM-HEADER %{UNIQUE_ID}e "expr=%{req:X-CUSTOM-HEADER} == ''"
答案1
该变量%{req:X-CUSTOM-HEADER}e
不是普通的环境变量。它实际上使用的是仅在表达式中可用的特殊函数[1] ap_expr
。如果您想访问 之外的请求标头ap_expr
,则必须更具创造力。根据您访问的文件类型的处理程序,它可能在带有前缀的环境变量中可用HTTP_
,后跟标头的“规范化”名称(破折号到下划线,全部大写)。
例如:
Header set X-CUSTOM-HEADER %{HTTP_X_CUSTOM_HEADER}e "expr=%{req:X-CUSTOM-HEADER} != ''"
Header set X-CUSTOM-HEADER %{UNIQUE_ID}e "expr=%{req:X-CUSTOM-HEADER} == ''"
这在通过 PHP-FPM 访问 PHP 文件时有效(因为 FastCGI 设置了这些变量),但对于简单的 HTML 文件则无效。对于这种情况,你可以使用 发挥更多创造力mod_rewrite
,因为它本身支持使用以下方式检查 HTTP 标头:重写条件。
# This grabs the existing header, if set, and creates the environment variable
RewriteCond %{HTTP:X-CUSTOM-HEADER} (.+)
RewriteRule . - [env=HTTP_X_CUSTOM_HEADER:%1]
Header set X-CUSTOM-HEADER "%{HTTP_X_CUSTOM_HEADER}e" env=HTTP_X_CUSTOM_HEADER
Header set X-CUSTOM-HEADER %{UNIQUE_ID}e env=!HTTP_X_CUSTOM_HEADER
[1]https://httpd.apache.org/docs/2.4/expr.html#vars
[2]https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond