【发布时间】: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 等)仍然失败。