这已在SO before上提出,但答案尚未概括。所以这里。
我有两个不同的网络应用。它们被设置在根目录的不同服务器上。但现在它们将被放置在同一服务器上的子目录中。下面的脚本将子目录和URI一起发送到脚本。这是一个问题。
旧网址:
新网址:
商店网站在看到/store/items/1
时会看到/items/1
。后台网站也是如此。
我的尝试:
location /store {
try_files @store_site;
}
location /backoffice {
try_files @backoffice_site;
}
location @store_site {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/store_site.sock;
proxy_set_header Host $host;
}
location @backoffice_site {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/backoffice_site.sock;
proxy_set_header Host $host;
}
同样,商店网站正在获取带有/store
前缀的网址,而后台正在获得/backoffice
。这些网站被编码为不期望这些前缀。我需要在发送到实际网站之前删除/store
和/backoffice
前缀。
这是重写规则吗?
我是根据this SO page尝试过的,但是没有用。我不能理解语法。
location /store {
rewrite ^/store/(.*) /$1;
try_files $uri @store_site;
}
更新
显然,这有效(添加break;
)这是一个完整的解决方案吗?
location /store {
rewrite ^/store/(.*) /$1 break;
try_files $uri @store_site;
}
答案 0 :(得分:10)
您需要在不触发重定向的情况下重写uri,如使用break
所述。
根据您设置的详细信息,是否所有内容都应该转到后端,或者Nginx是否应该提供某些请求(如静态文件),您需要...
location /store {
try_files $uri @store_site;
}
location /backoffice {
try_files $uri @backoffice_site;
}
location @store_site {
rewrite ^/store/(.*) /$1 break;
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/store_site.sock;
}
location @backoffice_site {
rewrite ^/backoffice/(.*) /$1 break;
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/backoffice_site.sock;
}
......或
location /store {
rewrite ^/store/(.*) /$1 break;
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/store_site.sock;
}
location /backoffice {
rewrite ^/backoffice/(.*) /$1 break;
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/backoffice_site.sock;
}
答案 1 :(得分:2)
我建议你试试这个项目:
location /store/ {
rewrite ^/store/(.*) /$1 break;
include uwsgi_params;
proxy_set_header Host $host;
uwsgi_pass unix:/var/run/uwsgi/store_site.sock;
}
没有测试过,但我认为它应该有用。