gpt4 book ai didi

apache - 304 响应未使用 mod_headers 为 apache 设置自定义 header

转载 作者:行者123 更新时间:2023-12-04 17:57:17 26 4
gpt4 key购买 nike

<VirtualHost *:80>
ServerAdmin webmaster@dev.dom.com
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
ServerName dev.dom.com
ServerAlias dev.dom.com
ErrorLog "logs/dev.dom.com-error.log"
CustomLog "logs/dev.dom.com-access.log" common
PassEnv CLUSTER
Header always set X-Cluster "%{CLUSTER}e"
</VirtualHost>

这是我的配置。我有一个环境变量,它告诉我我在哪个集群上,它作为“X-Cluster”中的 header 传递。这在 200 或 404 响应上返回正常,但 304 Not Modified 响应从不返回 header ,即使它返回其他适当的 Apache header 。

如何在 304 响应期间设置 header ?

最佳答案

根据当前的 HTTP 规范,一个 304 Not Modified响应不应返回实体 header (除了一些特定的异常(exception))。引自 section 10.3.5 of RFC 2616 :

If the conditional GET used a strong cache validator, the response SHOULD NOT include other entity-headers.Otherwise (i.e., the conditional GET used a weak validator), the response MUST NOT include other entity-headers; this prevents inconsistencies between cached entity-bodies and updated headers.


不幸的是,所有扩展 header 都是 classified as entity headers .
然而,展望 future ,在旨在取代 RFC 2616 的 HTTPbis 规范草案中,规则要宽松得多。引自 section 4.1 of the Conditional Requests spec :

Since the goal of a 304 response is to minimize information transferwhen the recipient already has one or more cached representations, asender SHOULD NOT generate representation metadata other than theabove listed fields unless said metadata exists for the purpose ofguiding cache updates.


因此,如果您正在设置一个不会被归类为表示元数据的自定义 header ,那么我希望根据新规则将其视为合法的。
也就是说,无论这些规范写了什么,您仍然必须处理 Apache 可以支持的内容。从我在源代码中看到的内容来看,304 响应中仍然不支持自定义 header 。
过滤headers的地方在文件 /modules/http/http_filters.c中的ap_http_header_filter函数中:
更具体地说,这段代码:
if (r->status == HTTP_NOT_MODIFIED) {
apr_table_do((int (*)(void *, const char *, const char *)) form_header_field,
(void *) &h, r->headers_out,
"Connection",
"Keep-Alive",
"ETag",
"Content-Location",
"Expires",
"Cache-Control",
"Vary",
"Warning",
"WWW-Authenticate",
"Proxy-Authenticate",
"Set-Cookie",
"Set-Cookie2",
NULL);
}
当返回“未修改”响应 (304) 时,上面的 header 列表是唯一允许通过的(除了一些自动生成的 header ,如日期和服务器)。从我所看到的,似乎没有一种简单的方法可以钩住这段代码来改变行为。
最重要的是,目前这在 Apache 中仍然是不可能的。至少有 one bug report请求支持其他 header ,但这是专门针对 CORS header 的。不过,如果幸运的话,这可能会鼓励他们更开放地支持一般的自定义 header 。
但在此之前,我建议的唯一解决方案是自己修补服务器。如果您不想从源代码重建,您甚至可以直接修补二进制文件。例如,如果您只需要支持一两个新 header ,则可以替换一些您不太可能使用的现有 header (例如 Set-Cookie2,它无论如何都已过时)。
只需在 Apache bin 目录中搜索要替换的 header 名称(在 Windows 上,您应该在 libhttpd.dll 中找到它们)。然后使用二进制编辑器将空终止字符串替换为您的新 header 名称(当然它需要与您要替换的 header 长度相同或更短)。
我不知道其他操作系统,但我已经在 Windows 上测试过它,它似乎确实有效。这显然是一个可怕的黑客,但如果你足够绝望,你可能会认为这是一个选择。

关于apache - 304 响应未使用 mod_headers 为 apache 设置自定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5926452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com