Apache 到 Nginx 的重写规则

Apache 到 Nginx 的重写规则

我有针对 Web 应用程序的 Apache 规则,如下所示:

RewriteEngine On
RewriteRule ^unsubscribe/([-A-z0-9]+)/?(.*)$ /list/unsubscribe.php?id=$1&why=$2 [L,QSA]
RewriteRule ^unsub/([-A-z0-9]+)/?(.*)$ /list/subscribe.php?id=$1&why=$2 [L,QSA]

我试过了:

rewrite ^unsubscribe/([-A-z0-9]+)/?(.*)$ /list/unsubscribe.php?id=$1&why=$2;

这似乎不匹配并导致 404。

    location /unsubscribe {
        rewrite ^/unsubscribe/([-A-z0-9]+)/?(.*)$ /list/unsubscribe.php?id=$1&why=$2 break;
    }

结果是提供文件服务,但未处理 PHPhttp://sg.hackandtell.org/unsubscribe/foo/bar

也许有人可以推荐一些调试策略?

答案1

我没有调试策略,所以我不能 100% 确定 nginx 在做什么。尽管我重写了重写规则,如下所示:

rewrite ^/unsubscribe/([a-zA-Z0-9]*)$ /list/unsubscribe.php?id=$1;
rewrite ^/unsub/([a-zA-Z0-9]*)$ /list/subscribe.php?id=$1;
rewrite ^/unsubscribe/([a-zA-Z0-9]*)/(.*)$ /list/unsubscribe.php?id=$1&why=$2;
rewrite ^/unsub/([a-zA-Z0-9]*)/(.*)$ /list/subscribe.php?id=$1&why=$2;

并且它有效。:)

答案2

nginx 维基状态:

最后 - 完成当前重写指令的处理并重新启动该过程(包括重写),并在所有可用位置搜索 URI 上的匹配项。

break - 完成当前重写指令的处理,非重写处理仅在当前位置块内继续。

因此,当使用时break,它将使用server {...}-wideroot指令(我假设您有一个)并静态提供文件。

您应该尝试last您的rewrite规则,因为这样 PHP 处理路由将在第二轮匹配并将请求定向到 PHP。

相关内容