【问题标题】:nginx rewrite redirect rule does not work properlynginx 重写重定向规则无法正常工作
【发布时间】:2012-09-25 09:08:41
【问题描述】:

我想将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_header 只是为了表明if ($request_uri ~* /\?action.*) { 发生了。 我尝试了其他几种解决方案,例如

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

没有成功。

更新

实际目标是:

如果网址看起来像这样

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&... 等 URL 等。

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

【问题讨论】:

    标签: url-rewriting nginx


    【解决方案1】:

    这是因为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

    【讨论】:

    • 我想我最好澄清一下我真正需要什么(问题将被更新)。您的回答很有帮助,但我正在重定向到 /add/?action=add,这并不是我所需要的。
    • 摆脱action=add 就像在重写替换字符串中添加一个不带action=add 的查询字符串一样简单,然后添加另一个? 以避免附加默认查询字符串。像rewrite ^ /$arg_action/?$newquery? permanent; 这样的东西可以解决问题。如何构造$newquery 变量留给读者作为练习(提示:map $args $newquery { ~^action=add\&(?<foo>.+) $foo; } 将是一个很好的起点,但它并没有涵盖所有可能的情况,因为通常不能保证action= 参数将是第一个)。
    • 好的,感谢您的回复,现在请给我一些时间来解决它。如果您更新了您的答案而不是对其发表评论,那也很好 - 它适用于社区 - 人们可能希望在一个地方看到一个完整的解决方案而无需费心阅读 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多