【问题标题】:nginx proxy_pass and URL decodingnginx proxy_pass 和 URL 解码
【发布时间】:2016-06-02 14:52:25
【问题描述】:

原始网址:/api/url%2Fencoded%2F/?with=queryParams

nginx:

location /api {
    client_max_body_size 2G;
    proxy_pass https://oursite;
}

通过此配置,我能够在通过代理时保留 URL 编码。如果我在“oursite”之后添加一个“/”,它将对 URL 进行解码。

问题:

现在代理后的 URL 仍然包含“/api/”。我只需要在保留 URL 编码部分的同时删除“/api/”。

【问题讨论】:

  • 如果我使用带中断的重写,它会再次解码
  • 不久前有相同的问题没有答案。在我看来,你应该 rething api 没有这样奇怪的 URL。另一种方法是在子域上使用 api。
  • @AlexeyTen,我有答案了!有没有机会获得一些选票? :-)
  • @SeanBollin,平!我在这里非常努力地回答问题,您是否可以花一些时间来决定它是否回答了您的问题?

标签: nginx


【解决方案1】:

不久前,有一个相同的问题没有答案。在我看来,你应该 rething api 没有这样奇怪的 URL。另一种方法是在子域上有 api。 – 阿列克谢十 2015 年 3 月 11 日 22:58

stackoverflow.com/q/28684300/1016033 – Alexey 15 年 3 月 11 日 10 日 23:01

接受了一年前的挑战!

    location /api/ {
        rewrite ^ $request_uri;
        rewrite ^/api/(.*) $1 break;
        return 400;
        proxy_pass http://127.0.0.1:82/$uri;
    }

就是这样,伙计们!

Nginx pass_proxy subdirectory without url decoding 的更多详细信息,但它也适用于查询字符串:

%  curl "localhost:81/api/url%2Fencoded%2F/?with=queryParams"
/url%2Fencoded%2F/?with=queryParams
%

【讨论】:

  • 对于没有嵌套路径的任何人,location / { proxy_pass http://127.0.0.1$request_uri; } 工作正常
  • @diachedelic,看看the more details answer 中的最后一个控制组——你的例子中的$request_uri 是多余的。
  • 口香糖你是对的,我的错误是添加了一个像 proxy_pass http://127.0.0.1/; 这样的斜线,这导致 nginx 规范化路径(在此处的文档中提到:nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
  • 在 CentOS 6.4 和 nginx 1.10.2 上出现同样的问题。这个答案解决了它。现在我想知道最新版本的 nginx(1.13.9)是否仍然有这种行为。这似乎是一种解决方法,而不是 Nginx 经典配置...
  • @MaX,从链接的full "More details…" answer 中查看链接的 trac 问题;您建议的选项将存在安全风险,因此,不提供它是 nginx 经典配置。对此的用例非常有限,当它确实发生时,上述解决方法是 100% 可行的,并且确实是最佳选择。 (感谢您的支持。)顺便说一句,如果您不修改$uri,则不会进行解码。而且你不可能同时拥有这两者而不是一团糟。
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2018-10-19
  • 2018-02-16
相关资源
最近更新 更多