nginx重写重定向规则无法正常工作

时间:2012-09-24 09:28:22

标签: url-rewriting nginx

我想将http://mysite.com/?action=add&goback=1等网址重定向到http://myiste.com/add/?goback=1

我来了:

location / {
    if ($request_uri ~* /\?action.*) {
        add_header Cache-Control private;
        rewrite ^/\?action=([^&]*)&?(.*)$ /$1/?$2 permanent;
    }
}

但它不起作用,我不明白为什么。

P.S。我需要add_header才能表明if ($request_uri ~* /\?action.*) {已发生。 我已经尝试了其他几个解决方案,比如

rewrite ^/\?action=(\w+).*$ /$1/?$query_string permanent;

没有成功。

更新

实际目标是:

如果URL看起来像这样

http://mysite.com/add/?param1=param1&...

/(add)/应该成为行动参数:

location  ~ /[\-\w]+/ {
    rewrite ^/([^/]*).*$ /?action=$1 last;
    ...
}

这似乎工作正常,我想我不需要额外的帮助

如果网址如下所示:

http://mysite.com/?action=add&param1=param1&...

nginx应重定向到:

http://mysite.com/add/?param1=param1&...

当我尝试执行此部分时,我得到的结果是我不需要的 - 无限重定向循环,像http://mysite.com/add/?action=add&param1=param1&...这样的网址等。

是否有解决我的目标的解决方案?

1 个答案:

答案 0 :(得分:2)

这是因为rewrite只匹配URI路径,没有查询sting aka参数,很像location。尝试这样的事情:

location = / {
    if ($arg_action) {
        rewrite ^ /$arg_action/ permanent;
    }
}

location = /检查将确保该规则仅适用于/的请求,if ($arg_action)检查是否存在action=...参数,rewrite ^ /$arg_action/ permanent;将实际上是重定向重写URI。查询字符串将保留(默认情况下)原始请求。

有关文档,请参阅http://nginx.org/r/rewrite