如何配置ngnix以便将代理路径从具有子文件夹的域重定向到/?
示例:
https://example.com/yoursub/
至
没有/ yoursub /前缀的localhost
目前,从Intranet直接访问服务器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的任何事情?
我无法控制基本域。
答案 0 :(得分:2)
如果我理解正确,则您要删除该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
的请求。
alias伪指令可能有点错误/不直观,因此最好将您的location伪指令保持在顶层(不嵌套在其他location块中)并尽可能简单。
如果您想添加 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
的请求
答案 1 :(得分:1)
尝试一下:
server {
...
location @proxy_to_app {
...
proxy_pass http://app_server/; # note the trailing slash
}
}
说明
按照nginx docs:
如果proxy_pass指令是使用URI指定的,则当请求传递到服务器时,与该位置匹配的规范化请求URI的一部分将由指令中指定的URI代替。
由于/
位置匹配任何内容,因此所有内容都将替换为/
(proxy_pass
中的斜杠),然后再替换为上游。
答案 2 :(得分:0)
我处理此问题的方法是使用重写规则:
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
,用于您的应用服务器。