在nginx中处理OPTIONS请求

35

我们目前正在使用HAProxy作为负载均衡器,它会定期使用OPTIONS请求向下游盒子发送请求以确保它们正常运行:

OPTIONS /index.html HTTP/1.0

我正在尝试使用带缓存的反向代理nginx(使用ncache)进行设置。出现问题的是,当一个OPTIONS请求到达时,nginx返回了405错误:

192.168.1.10 - - [22/Oct/2008:16:36:21 -0700] "OPTIONS /index.html HTTP/1.0" 405 325 "-" "-" 192.168.1.10

当直接访问下游Web服务器时,会得到正确的200响应。我的问题是:如何使nginx将该响应传递给HAProxy,或者如何在nginx.conf中设置响应?


1
这个模块现在有没有可用的呢? - user318576
2个回答

52
我可能迟到了,但我遇到了同样的问题,并找到了两个解决方案。
第一个是欺骗Nginx,让它认为405状态实际上是200 OK,然后将其代理传递给你的HAProxy,像这样:
error_page 405 =200 @405;
location @405 {
    root /;
    proxy_pass http://yourproxy:8080;
}

第二个解决方案就是捕获OPTIONS请求并为这些请求构建响应。
location / {
    if ($request_method = OPTIONS ) {
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 200;
    }
}

只需选择适合你的那个。
我在博客文章中写了这个,你可以在那里找到更多细节。

2
假设您已经设置了proxy_pass - nginx为什么不直接转发OPTIONS请求而不必进行第一个技巧呢?基本上是一种说法,即“不要解释HTTP动词,只需像我已经说过的那样转发它”。 - wal
1
我正在尝试这个,但是 if ($request_method = OPTIONS) 似乎不起作用,请求被发送到我的后端。是否有新的语法? - Diana

2
在httpchk选项中,您可以像这样指定HTTP方法:
httpchk GET http://example.com/check.php

您也可以使用POST或像/这样的纯URI。由于PHP运行在Nginx外部,因此我会检查PHP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接