如何将nginx中的URL重写到更新的位置?

如何将nginx中的URL重写到更新的位置?,nginx,rewrite,Nginx,Rewrite,我有以下网址: 1) http://example.com/downloads/ 2) http://example.com/downloads/widgets 3) http://example.com/downloads/gadgets 这些URL需要重定向并重写到以下位置: 1) http://example.com/products/ 2 & 3 & etc) http://example.com/products/thingies 我目前正在尝试以下nginx代码:

我有以下网址:

1) http://example.com/downloads/
2) http://example.com/downloads/widgets
3) http://example.com/downloads/gadgets
这些URL需要重定向并重写到以下位置:

1) http://example.com/products/
2 & 3 & etc) http://example.com/products/thingies
我目前正在尝试以下nginx代码:

location ~* ^/downloads/ {
    rewrite ^/downloads/$ /products break;
    rewrite ^/downloads/(.*)$ /products/thingies break;
}
它几乎可以工作了,但是我的站点的文档根是
/var/www/example.com/public
。因此,在处理重写规则之后,nginx尝试从字面上为
/var/www/example.com/public/products/
服务,而我希望它只是重写到
http://example.com/products/
(然后代理PHP等)

我在哪里失败了?有没有其他更好的方法来实现这一点

谢谢你的帮助

--更新-- 我通过使用以下规则使其工作:

重写^/downloads/?$$scheme://$host/tools last

location ~* ^/downloads/ {
    rewrite ^/downloads/?$ $scheme://$host/products last; 
    rewrite ^/downloads/(.*)$ $scheme://$host/products/thingies last;
}

在nginx中这是正确的方法吗?在研究这一点时,我在任何地方都没有见过这种重写规则格式。这似乎有点奇怪。

正确的语法似乎是:

location ~* ^/downloads/ {
    rewrite ^/downloads/?$ /products permanent; 
    rewrite ^/downloads/(.*)$ /products/thingies permanent;
}

您的更新将重定向,而不是重写

我会这样做:

location /downloads/ {
    rewrite ^ /products/thingies;
}

location = /downloads/ {
    rewrite ^ /products/;
}

# uncomment if you need '/downloads' (without trailing slash) act as '/downloads/'
#location = /downloads {
#    rewrite ^ /products/;
#}

你应该使用
last
而不是
break
。你需要重定向(将用户浏览器发送到新的url)还是重写(就像用户需要
/products/
而不是
/downloads/
)?我需要重写(更新了问题-感谢你抓住了这个问题)。至于使用“last”-这不会重新启动规则处理并导致重定向循环吗?根据nginx文档:你说得对,“last”和$scheme://$host一起完成了这个任务。我不确定这是否是正确的方法,但有没有更正确的方法?