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

Url rewriting nginx重写重定向规则无法正常工作,url-rewriting,nginx,Url Rewriting,Nginx,我想重定向URL,如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;

我想重定向URL,如
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;
    }
}
但它不起作用,我也不明白为什么

另外,我需要
add\u header
来指示
是否($request\u uri~*/\?action.*){
发生了。 我尝试过其他几种解决方案,比如

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

更新

实际目标是:

如果URL看起来像这样

http://mysite.com/add/?param1=param1&...
/(添加)/应成为操作参数:

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¶m1=param1&...


有解决方案可以满足我的目标吗?

这是因为
重写
只匹配URI路径,没有查询参数,很像
位置
。请尝试类似的方法:

location = / {
    if ($arg_action) {
        rewrite ^ /$arg_action/ permanent;
    }
}
location=/
检查将确保该规则仅应用于对
/
的请求,
if($arg\u action)
检查是否存在
action=…
参数,
rewrite^/$arg\u action/permanent;
将实际重定向到重写的URI。查询字符串将被保留(默认情况下)从最初的要求


有关文档,请参阅。

我想我最好澄清我实际需要什么(问题将更新)。您的回答很有帮助,但是我得到了一个重定向到
/add/?action=add
,这不是我所需要的。摆脱
action=add
非常简单,只需在重写替换字符串中添加一个查询字符串,而不添加
action=add
,然后添加另一个
,以避免默认的查询字符串追加。类似于
rewrite^/$arg\u action/?$newquery?permanent;
就可以了。如何构造
$newquery
变量留给读者作为练习(提示:
map$args$newquery{~^action=add\&(?)$foo;}
将是一个很好的起点,但它并没有涵盖所有可能的情况,因为通常无法保证
操作=
参数将是第一个).好的,谢谢你的回复,现在请给我一些时间来讨论一下。如果你更新了你的答案而不是发表评论,那也会很好-这是为了社区-那些希望在一个地方看到完整解决方案而不必费心阅读评论的人。