2013-02-18 110 views
8

在我的环境中,我使用perlbal将请求重定向到nginx。如果verify_backend处于打开状态。 perbal会向nginx发送一个“OPTIONS *”请求,但是nginx将它作为一个不好的请求来回应。如何在nginx中处理“OPTIONS *”请求?

根据RFC2616

如果Request-URI是一个星号(“”),OPTIONS请求旨在适用于服务器一般,而不是特定的资源?由于服务器的通信选项通常取决于资源,因此“”请求仅作为“ping”或“no-op”类型的方法有用;除了允许客户端测试服务器的功能之外,它什么都不做。例如,这可用于测试代理是否符合HTTP/1.1(或缺乏)。

我想perlbal试图发送这种请求,但nginx默认情况下无法处理这个。

当我试图发送一个请求 “OPTIONS * HTTP/1.0”,我总是得到 “HTTP 400错误的请求”:

127.0.0.1 - - [18 /二月/ 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返回200而不是HTTP返回400?

+0

我不认为这是一个解决方案但你有没有尝试使用带有'Host:'头部的HTTP/1.1? ala ...'选项* HTTP/1.1 \ r \ n主机:devserver \ r \ n \ r \ n'。根据[RFC2616第9节](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html):HTTP/1.1的一组常用方法定义如下...' – Basic 2013-02-18 12:55:01

+0

嗨,谢谢为您的想法,但我仍然有'400坏请求',甚至没有机会输入标头 我试图通过远程登录发出带主机标题的选项请求: ' telnet 10.1.128.97 5274 尝试10.1.128.97 .. 。 连接到10.1.128.97。 转义字符是'^]'。 OPTIONS * HTTP/1.1 400错误的请求 <体BGCOLOR = “白色”>

400错误的请求


的nginx/1.2.6
连接被关闭国外主机。 ' – Cody 2013-02-22 06:41:48

回答

8

我知道这是一个矫枉过正,但一个解决办法是把HAProxy的在它前面刚刚捕获OPTIONS请求,然后建立HAProxy的自己的回应:

location * { 
    if ($request_method = OPTIONS) { 
     add_header Content-Length 0; 
     add_header Content-Type text/plain; 
     return 200; 
    } 
}