如何在传递给脚本之前从URL中删除子目录?

时间:2017-01-12 04:28:18

标签: nginx url-rewriting

这已在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;
}

2 个答案:

答案 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;
}

没有测试过,但我认为它应该有用。