本文写于 11 年前(2015 年 1 月),部分内容可能已经过时。

我们需要将一个URL在服务端进行重定向。比如请求: http://study.arganzheng.me/goto?targetUrl=http%3A%2F%2Freading.arganzheng.me%2Fbook%2Fshare&xxx=yyy,将重定向到targetUrl去:http://reading.arganzheng.me/book/share 去。

那么使用nginx的URL rewrite是很明显的解决方案:

location /goto {
    rewrite ^(.*)$  $arg_targetUrl redirect;
}

但是测试发现:http://study.arganzheng.me/goto?targetUrl=http%3A%2F%2Freading.arganzheng.me%2Fbook%2Fshare&xxx=yyy经过上面的重定向之后变成了:http://reading.arganzheng.me/book/share?targetUrl=http%3A%2F%2Freading.arganzheng.me%2Fbook%2Fshare&xxx=yyy。就是请求字符串很讨厌的仍然被带上了。

谷歌了一下,发现很多人也遇到这个问题,解决方案很简单,只要在重定向的URL后面加上问号?作为结束符就可以了:

location /goto {
    rewrite ^(.*)$  $arg_targetUrl? redirect;
}

An easy way to make nginx redirect without query parameters

nginx -s reload 一下,果然可以了。

当然,主干流程完成之后,最好还要验证一下是不是GET请求,是不是有targetUrl参数。

本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/nginx-rewrite.html)的前提下,欢迎各种形式的转载、翻译或商业引用。


COMMENTS

评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。

×