我无法<Location "/specific-url/">
在 Apache 2.2 (v2.2.22) 上工作。
我想为整个站点设置一个 HTTP 标头,除了一个特定的 URL 路径:(/baz
和/baz/
,/baz/quuz
等)。
因此我设置了以下 Apache 配置:
<VirtualHost _default_:443>
<Location "/">
Header set X-Foo "bar"
</Location>
<Location "/baz">
Header unset X-Foo
</Location>
</VirtualHost>
X-Foo
对于非 URL,确实返回了标头/baz
:
curl -D - https://example.com/qux -o /dev/null -s | grep "X-Foo"
# Outputs:
# X-Foo: bar
但是,这也是失败的地方,对于/baz
URL 也是如此:
curl -D - https://example.com/baz -o /dev/null -s | grep "X-Foo"
# Outputs:
# X-Foo: bar
好像<Location "/">
有效但<Location "/baz">
不匹配。
我也尝试过:
<Location "/">
Header set X-Foo "bar"
</Location>
<Location "/">
Header unset X-Foo
</Location>
并且标题X-Foo
永远不会返回,Header unset
作品也是如此。
答案1
在将响应发送到网络之前,会处理 Header 指令。
换句话说,Header set X-Foo "bar"
仅适用于后所有内容都已处理完毕,响应即将发送。同样,Header unset X-Foo
仅当响应中已经存在标头时才会应用(或删除) - 例如,如果应用程序发送了它。
正如我所建议的,你实际上需要从不同的角度重新思考这个问题。不要试图设置然后取消设置,只需将设置应用于全部减去您想要排除的内容。以下方法有效:
<LocationMatch "^/(?!baz)">
Header always set X-Foo "bar"
</LocationMatch>
X-Foo: bar
将设置为所有请求,减去:
/baz
/baz/
/baz/abcd*
always
另外,请注意将标题应用于不成功响应的额外指令。