如何将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一起完成了这个任务。我不确定这是否是正确的方法,但有没有更正确的方法?