我有针对 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。