如何将 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 重定向响应位置的主要内容,如果未能解决你的问题,请参考以下文章