Apache 重写规则添加了空的允许标头

Apache 重写规则添加了空的允许标头

我正在使用 Apache(2.2)重写规则将许多 HTTP 方法列入白名单:

RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|DELETE|PUT|POST)$
RewriteRule ^(.*)$ - [F,L]

这很有效,并且拒绝了不需要的方法:

curl -X ACL -v http://localhost/my-page/
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1... connected
> ACL /my-page/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Accept: */*
> Host: localhost
> 
< HTTP/1.1 403 Forbidden
< Date: Fri, 18 Jul 2014 16:15:29 GMT
< Server: Apache
< Vary: Accept-Encoding
< Content-Length: 217
< Content-Type: text/html; charset=iso-8859-1

我认为将重写改为发送“405 - 方法不允许”响应会很好:

RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|DELETE|PUT|POST)$
RewriteRule ^(.*)$ - [R=405,L]

然而,通过这个简单的改变,我现在在我的响应中得到了一个虚假的空允许标头:

curl -X ACL -v http://localhost/my-page/
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1... connected
> ACL /my-page/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Accept: */*
> Host: localhost
> 
< HTTP/1.1 405 Method Not Allowed
< Date: Fri, 18 Jul 2014 16:18:37 GMT
< Server: Apache
< Allow: 
< Vary: Accept-Encoding
< Content-Length: 236
< Content-Type: text/html; charset=iso-8859-1

Apache 为什么要插入此标头?我尝试使用“SetEnvIf / Header add”发送有效的 Allow 标头,在这种情况下,我最终得到 2 个 Allow 标头。我能以某种方式摆脱空的 Allow 标头吗,或者安排正确填充它?

答案1

等待令人沮丧的是,Apache 添加了标头,当然,RFC 说他们需要这样做。但是 Apache 添加了一个 EMPTY 标头,而 RFC 说他们应该列出应该起作用的方法。

根据 RFC,允许:没有列出任何方法,正如 Apache 所创建的那样,意味着根本没有任何方法可以起作用。

幸运的是,很少有客户端会注意到 Allow 标头,无论它来自 OPTIONS,还是作为必需的 405 的一部分,或者(建议但不要求)作为 501 的一部分。

没有人使用 OPTIONS 或关注 Allow 标头的原因是,很少(几乎从未)看到它们正确实施。而且,与 Apache 一样,对于 Web 设计师来说,说服服务器正确执行这些操作非常困难,甚至不可能。

坦率地说,这真是一团糟,IETF 错过了 HTTP 的新 RFC。他们应该做的是通过弃用 Allow 标头来编纂现有做法,并解释说服务器将做任何他们想做的事情,客户端应该忽略它们,整个混乱局面应该被遗忘。

相关内容