如何在 nginx 中处理“OPTIONS *”请求?
Posted
技术标签:
【中文标题】如何在 nginx 中处理“OPTIONS *”请求?【英文标题】:How to handle "OPTIONS *" request in nginx? 【发布时间】:2013-02-02 11:21:18 【问题描述】:在我的环境中,我使用 perlbal 将请求重定向到 nginx。如果 verify_backend 已打开。 perbal 将向 nginx 发送“OPTIONS *”请求,但 nginx 将其响应为错误请求。
根据RFC2616:
如果 Request-URI 是星号(“”),则 OPTIONS 请求通常应用于 ?server 而不是特定资源。由于服务器的通信选项通常取决于资源,因此“”请求仅用作“ping”或“no-op”类型的方法;除了允许客户端测试服务器的功能之外,它什么也不做。例如,这可用于测试代理的 HTTP/1.1 合规性(或不合规性)。
我认为 perlbal 正在尝试发送这种请求,但默认情况下 nginx 无法处理。
当我尝试发送请求“OPTIONS * HTTP/1.0”时,总是收到“HTTP 400 bad request”:
127.0.0.1 - - [18/Feb/2013:03:55:47 +0000] "OPTIONS * HTTP/1.0" 400 172 "-" "-" "-"
但它适用于没有星号请求的“OPTIONS / HTTP/1.0”选项:
127.0.0.1 - - [18/Feb/2013:04:03:56 +0000] "OPTIONS / HTTP/1.0" 200 0 "-" "-" "-"
如何配置 nginx 让它响应 http return 200 而不是 HTTP return 400 ?
【问题讨论】:
我不认为这是一个解决方案,但您是否尝试过使用带有Host:
标头的 HTTP/1.1?唉...OPTIONS * HTTP/1.1\r\nHost: devserver\r\n\r\n
。根据RFC2616 Section 9:The set of common methods for HTTP/1.1 is defined below...
嗨,谢谢你的想法,但我还是得到了400 Bad Request
,甚至没有机会输入标题我试图通过 telnet 发出带有主机标题的选项请求:` telnet 10.1.128.97 5274 Trying 10.1.128.97... 连接到 10.1.128.97。转义字符是'^]'。选项 * HTTP/1.1
400 错误请求
我知道这是一种矫枉过正,但一种解决方案是将 HAProxy 放在它前面以捕获该 OPTIONS 请求,然后在 HAProxy 中构建您自己的响应:
location *
if ($request_method = OPTIONS )
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
【讨论】:
【参考方案2】:我发现在这种情况下修改行为的唯一方法是一般响应 400:
error_page 400 =200 /empty_reply.html;
您可以只对您无法处理的所有内容发送空响应。 对于想要尝试以另一种方式解决此问题的人,您可以使用以下命令模拟此请求:
curl -X OPTIONS $yourserverip --request-target "*" --http1.1
【讨论】:
以上是关于如何在 nginx 中处理“OPTIONS *”请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 nginx 中正确设置 X-Frame-Options Allow-From