如何将 nginx 位置添加回 302 重定向响应位置

Posted

技术标签:

【中文标题】如何将 nginx 位置添加回 302 重定向响应位置【英文标题】:How to add nginx location back to 302 redirect response location 【发布时间】:2020-03-16 20:58:08 【问题描述】:

我有一个 django-cms 应用程序在 nginx 服务器后面运行。我正在使用 proxy_pass 将流量发送到 cms 应用程序。我正在使用 location /django-cms ,所以当我转到 https://nginxserver/django-cms 它实际上可以工作并将流量发送到 CMS 服务器,但是 CMS 应用程序正在发回 302 响应并且响应包含 Location: en/ ,所以浏览器尝试访问 https://nginxserver/en/ 而不是 f https://nginxserver/django-cms/en。这显然会导致 404 错误。如何确保 CMS 服务器的所有内容都命中 https://nginxserver/django-cms/ ?

这里是 nginx.conf 文件中的相关部分。

location /django-cms 
    auth_request /request_validate;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://10.0.2.29:8000;

【问题讨论】:

CMS服务器知道他是/django-cms还是只知道他是nginxserver? 当请求(由 nginx 服务器代理)到达 CMS 服务器时,CMS 服务器将其视为来自10.0.2.29:800 的请求。它以 /en 的重定向位置响应,没有 nginx 服务器将转换为 10.0.2.29:8000/en 和后续 url 就像 10.0.2.29:8000/en/admin 等。 但是当 nginx 将响应返回给浏览器时,浏览器会向nginxserver/en 发送回一个请求。所以 nginx 不能代理它(因为代理它需要nginxserver/django-cms/en)所以它给出了 404 错误。我尝试使用代理重定向指令发送 /django-cms/en 的位置,但随后的请求(即到 /en/admin 等)仍然失败。 【参考方案1】:
location /django-cms 
  proxy_pass http://10.0.2.29:8000;
  proxy_redirect ~^/(.*) scheme://$http_host/django-cms/$1;

代理重定向指令可以帮助你,你可以试试吗?它将 django-cms 添加到后端(cms)给你的任何重定向。

这是我第一次使用它,但它看起来像是在 nginx 文档中使用它的方式。

(发现另一个和你有同样问题的问题):

Intercepting backend 301/302 redirects (proxy_pass) and rewriting to another location block possible?

以防万一你也想检查它:D

【讨论】:

以上是关于如何将 nginx 位置添加回 302 重定向响应位置的主要内容,如果未能解决你的问题,请参考以下文章

从 Chrome 重定向到带有位置标头的 302 后被阻止的 Android 应用

302 响应错误

302 重定向是如何发生的?

表单提交响应 301 或 302

处理 http 302 重定向响应

Service Worker:如何处理 302 重定向响应