如何配置 ngnix 以将代理通行证从具有子文件夹的域重定向到/?
例:
https://example.com/yoursub/自不带/yoursub/前缀
的本地主机目前,从内部网直接访问服务器 ip http://xxx.xxx.xxx.xx/可以正常工作。
我的 nginx 配置文件:
upstream app_server {
server unix:/home/myname/APP-Server/gunicorn/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
# add here the ip address of your server
# or a domain pointing to that ip (like example.com or www.example.com)
server_name 123.456.789.1;
keepalive_timeout 5;
client_max_body_size 4G;
access_log /home/myname/APP-Server/logs/nginx-access.log;
error_log /home/myname/APP-Server/logs/nginx-error.log;
location /static/ {
alias /home/myname/APP-Server/static-root/;
}
# checks for static file, if not found proxy to app
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
如果相关:后端是一个带有 gunicorn 服务器的 django 应用程序。
我必须考虑从https重定向到http的任何信息吗?
我无法控制基本域。
理解正确,您想删除 URI 的第一部分。 有多种方法可以做到这一点,但最简单的方法可能是使用 alias 指令,它将删除与当前位置块匹配的 URI 部分:
location /foo/ {
alias /home/myname/APP-Server/static-root/; # It doesn't really matter what you put here, since you're proxying everything.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
如果你的 Nginx 服务器运行在 foobar.example 上,并且你请求http://foobar.example/foo/bar
,上游服务器将看到一个http://foobar.example/bar
请求。
别名指令可能有点错误/不直观,因此最好保持位置指令的顶级(而不是嵌套在其他位置块中(并尽可能简单。
如果要向 URI 添加前缀,可以在 proxy_pass 指令本身中执行此操作:
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server/foo$uri$is_args$args;
}
如果你的Nginx服务器运行在foobar.example上,并且你请求http://foobar.example/bar
,上游服务器将看到一个http://foobar.example/foo/bar
请求
试试这个:
server {
...
location @proxy_to_app {
...
proxy_pass http://app_server/; # note the trailing slash
}
}
解释
根据nginx文档:
如果使用 URI 指定 proxy_pass 指令,则在将请求传递到服务器时,与位置匹配的规范化请求 URI 部分将替换为指令中指定的 URI。
由于/
位置匹配任何内容,因此在代理到上游之前,所有内容都将替换为/
(proxy_pass
中的尾部斜杠(。
我处理这个问题的方式是使用重写规则:
location /yoursub {
rewrite /yoursub(.*) $1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
重写会将应用服务器的 URL 从 /yoursub/path/to/view
转换为/path/to/view
。