首页 » web服务 » nginx rewrite网址带有问号和参数的问题

nginx rewrite网址带有问号和参数的问题

时间:2013-09-04作者:felix.chan分类:web服务评论:3

由于网站静态化之后,首页右上角的文章搜索功能一直不好用,今天终于找个时间想处理下,本来打算改wordpress的模板文件来解决,但是身为一个专业的运维人员,感觉这种方法很低级,还是用nginx 的 rewrite功能来解决吧,本来以为很简单的一件事情没想到确是搞的如此复杂,记录一下事情的全部过程吧。

网站每次搜索文章是,输入了搜索的内容提交之后,get的地址为:http://www.rednat.com/?s=felix.chan&submit=
其中felix.chan为我搜索输入的关键字
现在要将该地址转化为:http://www.rednat.com/search/felix.chan

起初一看,这还不简单,一条rewrite 301永久重定向就搞掂:

rewrite http://www.rednat.com/?s=(felix.chan)&submit= http://www.rednat.com/search/$1 permanent;

结果一测试,不行!没有效果。我就有一种不祥的预感,麻烦来了。

观察源地址,只有域名,没有具体的文件名,而且域名后面是直接带的参数,使用了问号,以前我对文件名的rewrite都很正常的,这次没搞成功,肯定和这个问号后面带的参数变量有关系。

察了下nginx的相关rewrite文档发现这个问号在nginx中有特殊用途。

在默认情况下,nginx ?后面的内容不参与正则匹配了,所以以前匹配地址都没问题,那是因为地址都是在?之前的。

经过数个小时的翻阅文档,最后终于测试出可以解决的方法:

抱歉,只有对本文发表过评论才能阅读隐藏内容。

这个地方有两个关键点:
1、$query_string 这个变量中保存了网址中所带的参数变量,所以正则匹配时要指定用这个变量来进行。
2、http://www.rednat.com/search/$s? 这个转化后的地址,为什么最后还有一个问号? 这个很重要,这个?表示在接受了$s变量中的内容之后(felix.chan),终止其他变量的传入。如果不带这个问号会有什么问题?问题如下,转换后的地址为:

http://www.rednat.com/search/felix.chan?s=felix.chan&submit=

显然,这个地址不是我们预先想要的。

原创文章,转载请注明: 转载自红防联盟www.rednat.com

本文链接地址: nginx rewrite网址带有问号和参数的问题

|2|right
Tags: ,
3 条评论
  1. avatar
    fqerfq China SouGou Browser Windows 2013-10-25 16:23 回复

    tgwgwg

  2. avatar
    aveen China Google Chrome Windows 2014-02-11 13:52 回复

    很好 受用了

  3. avatar
    好玩的网站 China Google Chrome Windows 2014-05-31 08:30 回复

    评论才能查看全文?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>