阿帕奇指令不匹配

阿帕奇指令不匹配

我无法<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

但是,这也是失败的地方,对于/bazURL 也是如此:

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

根据Apache 2.0 手册

在将响应发送到网络之前,会处理 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另外,请注意将标题应用于不成功响应的额外指令。

相关内容