我想将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¶m1=param1&...
nginx应重定向到:
http://mysite.com/add/?param1=param1&...
当我尝试执行此部分时,我得到的结果是我不需要的 - 无限重定向循环,像http://mysite.com/add/?action=add¶m1=param1&...
这样的网址等。
是否有解决我的目标的解决方案?
答案 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。