Nginx的。重写除一条路径

时间:2017-04-04 06:50:39

标签: mod-rewrite nginx

这是我在配置文件中的重写规则。

location / {
        rewrite ^/(.*)(?:\?(.*))?$  /mis/page/home last;
        rewrite ^/login(\?.*)?$     /account/page/login$1 last;

        try_files $uri $uri/ /index.php;
        rewrite ^(.+)$ /index.php?_url=$1 last;
    }

我想将/login重写为/account/page/login$1,其他所有人请求/mis/page/home,然后所有请求都应重新写入index.php。

但是通过上面的配置,我从服务器获得了500 Internal Errorerror.log中的错误消息是:

rewrite or internal redirection cycle while processing "/mis/page/home"

如何实施我的要求?

谢谢。

2 个答案:

答案 0 :(得分:0)

我猜您是要尝试向/account/page/login$1提供/mis/page/home/index.php?_url=?因为那是最后一次重写所做的。这是一个全能的。

location / {
    rewrite ^/login(\?.*)?$     /account/page/login$1 last;
    rewrite !^/login  /mis/page/home last;

    try_files $uri $uri/ /index.php;
    rewrite ^(.+)$ /index.php?_url=$1 last;
}

答案 1 :(得分:0)

您似乎在?语句的正则表达式中查找文字rewrite,但nginx使用的规范化 URI被删除了请求参数。有关详细信息,请参阅this document

如果默认操作是使用带有/index.php参数的_url=/mis/page/home,则可以直接在try_files语句中构建。

要对事物进行分区,请为/login URI使用单独的位置块。

也许我过分简化了您的要求,但这就是我的意思:

location / {
    try_files $uri $uri/ /index.php?_url=/mis/page/home;
}
location = /login {
    rewrite ^ /index.php?_url=/account/page/login last;
}