Nginx重写-上次忽略?

Nginx重写-上次忽略?,nginx,rewrite,Nginx,Rewrite,在Apache中,这种逻辑运行良好——根据文档,Nginx也是如此 location = /login/ { rewrite ^(.*)$ /login.php last; } rewrite ^/([^/]*)/$ /page.php?c=$1 last; 理想情况下,domain.com/login/将直接指向login.php 其他任何内容都将直接指向page.php,并传递详细信息。 但是,所有请求都指向page.php 缺少什么吗?:) 我想,你错误地认为指令的顺序很重要,但事

在Apache中,这种逻辑运行良好——根据文档,Nginx也是如此

location = /login/ {    rewrite ^(.*)$ /login.php last; }
rewrite ^/([^/]*)/$ /page.php?c=$1 last;
理想情况下,domain.com/login/将直接指向login.php

其他任何内容都将直接指向page.php,并传递详细信息。 但是,所有请求都指向page.php


缺少什么吗?:)

我想,你错误地认为指令的顺序很重要,但事实并非如此。Nginx有严格的指令执行顺序,“服务器级”
rewrite
在尝试匹配
location
之前工作

您应该避免“服务器级”
rewrite
s。在这种情况下,我会写:

location / {
    rewrite ^/([^/]*)/$ /page.php?c=$1;
}

location = /login/ {
    rewrite ^ /login.php;
}

# I guess you have something like this too
location ~ \.php$ {
    ...
}

订单事务主管。但有些指令是先评估的。重写触发位置块的重新评估@quazardous一般来说,顺序并不重要。有一些例外情况,来自重写模块的指令是最常见的。第二常见的是regexp
location
s。