Apache 2.4 从请求标头读取并在响应标头中设置相同的内容

Apache 2.4 从请求标头读取并在响应标头中设置相同的内容

我正在使用 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

相关内容