0

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

我来到:

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

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

PS我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;
    ...
}

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

如果 URL 看起来像这样:

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

nginx 应该重定向到:

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

当我尝试做这部分时,我得到了我不需要的结果 - 无限重定向循环、URL 等http://mysite.com/add/?action=add&param1=param1&...

有解决我的目标的解决方案吗?

4

1 回答 1

2

这是因为rewrite只匹配 URI 路径,没有查询字符串 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

于 2012-09-24T10:50:56.253 回答