在nginx中,如何允许任意字符串作为http方法?

问题描述 投票:0回答:2

我使用 nginx 作为反向代理服务器。

它背后的我的应用程序服务器接受请求的自定义扩展方法。 例如,“我的方法”。

但是 nginx 默认配置似乎只接受非扩展方法,例如 HEAD、GET、POST 等,并对没有非扩展方法的请求返回默认的 nginx 400 响应,而不是将这些请求代理到我的应用程序服务器。

如何让 nginx 接受并代理任何 http 请求,无论其方法如何?

我不想将特定方法列入白名单,因为这需要我每次需要在应用程序服务器中支持新方法时更改 nginx 配置,并且我不希望它们紧密耦合。

[编辑]

该解决方案必须适用于官方支持的 nginx 发行版,无论是 nginx.com 还是流行的 Linux 发行版(debian、centos 等)。

显然,我可以更改 nginx 源代码并使其传递任何方法,但如果我更改源代码并重新编译,它就不再是 nginx,而是它的一个分支。

nginx
2个回答
3
投票

您可以使用 ngx_http_allow_methods_module 来允许自定义 HTTP 方法。该模块允许将任意 HTTP 方法传递到后端应用程序。

示例:

http {
    server {

        location /api/ {
            allow_methods ".*";
        }

    }
}

指令

allow_methods "^(GET|POST|PUT|DELETE|PATCH|LINK|COPY)$";

该指令描述了应该传递的 HTTP 方法。该模式区分大小写(根据 RFC 2616)。如果不存在,则应用 Nginx 的默认规则。您应该仅在真正需要它的位置使用此指令。


0
投票

我不确定为什么您在 nginx 中将字符串作为方法传递时遇到问题。我已经对我的设置进行了测试,但没有遇到您所描述的行为。我虽然这种行为可能会改变,但我在 nginx 变更日志中找不到与此问题相关的任何最新更改,网址为 https://nginx.org/en/CHANGES。此外,有许多在线文章详细介绍了如何使用配置来阻止方法,例如在 https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_ except 中找到的配置。您看到的 400 响应代码可能实际上是由 Web 应用程序生成的,而不是 nginx 本身生成的。

© www.soinside.com 2019 - 2024. All rights reserved.