我正在使用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 /头添加”发送一个有效的允许头,在这种情况下,我结束了2允许头。 我可以以某种方式摆脱空允许标题,或者也许安排它正确填充?
等待令人沮丧的是Apache添加了头文件,当然,RFC表示他们需要。 但是,当RFC说他们应该列出应该工作的方法时,Apache添加一个EMPTY标头。
通过RFC,Allow:列出的NO方法,就像Apache创build的一样,意味着没有任何方法可以工作。
幸运的是,很less有客户注意到允许标题,不pipe是OPTIONS,还是作为要求的405的一部分,或作为501的一部分(作为build议,但不是必需的)。
没有人使用OPTIONS或关注允许标题的原因是非常罕见(几乎从不),看到它们正确实施。 而且,与Apache一样,网页devise者也很难(如果不是不可能的话)说服服务器做对。
坦率地说,这是一个烂摊子,IETF错过了HTTP的新RFC。 他们应该做的是通过贬低Allow头来编纂现有的做法,解释服务器会做他们想做的事情,客户应该忽略它们,应该忘记整个混乱。