我正在设置一个反向代理,它接收来自联合身份验证服务器的请求并将其转发到我的后端应用程序。当请求缺少尾部斜杠时,nginx 会执行其默认的 301 重定向,但它重定向到的地址不包含位置块中匹配的路径。这个想法是将请求从代理到Gunicorn 中的upstream.com/myApp
根 URL backend.com/
。我的配置是:
geo $allow {
default 0;
<upstream ip> 1;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
set_real_ip_from <backend ip>;
real_ip_header X-Forwarded-For;
if ($allow = 0) {
return 444;
}
server_name backend.com;
underscores_in_headers on;
include snippets/<ssl-conf>;
include snippets/<ssl-params>;
location /<myApp>/static/ {
root /<path>/<myApp>/static;
}
location /<myApp>/ {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass http://unix:/<path>/<myApp>/<myApp>.sock:/;
}
location = /<myApp> {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass
http://unix:/<path>/<myApp>/<myApp>.sock:/;
}
}
最初,我只包含了第一个位置块,但是当请求来自upstream.com/myApp
(没有尾部斜杠)时,nginx 会重定向到backend.com/myApp/
,并且不会转发原始请求的标头。添加第二个位置块以防止重定向解决了该问题。
但是,现在,如果我收到类似的请求upstream.com/myApp/search
(同样,没有尾随斜杠),它会进行 301 重定向到upstream.com/search/
(添加尾随斜杠,但部分消失。在 nginx 进行重定向后,如何保留 url 中的一部分?
答案1
我又做了一些调试,结果发现这不是 Nginx 的问题。而是 Django 没有将 nginx 代理过滤掉的路径附加到重定向中的问题。
答案2
这不是 Nginx 的问题,而是 Nginx 的功能。如果您不希望 Nginx 删除与您的位置块匹配的路径部分,则您的 proxy_pass 指令不能在 server:port 或 socket 之后指定路径。
这只包括末尾的斜杠,您指定的任何路径都将替换位置块的匹配部分,如果您只指定斜杠,那么它将删除匹配部分