如果查询字符串存在,则 nginx 重写

如果查询字符串存在,则 nginx 重写

过去,一个项目从 移动到//subdir由于旧的 URL 结构类似于,/index.php?foo/123/bar我使用以下重写将所有内容移至/forum

rewrite ^\/index\.php(.*)$ /forum/$1 last;

此重写的问题是它还会重定向//forum/和。现在我不想重定向它们,因为 中已创建了一个新的/index.php起始页。/forum//

因此/不应该被重定向,但如果有查询字符串,就应该被重定向。

我尝试了以下操作:

location / {
        if ($query_string !~ "") {
                rewrite ^\/index\.php(.*)$ /forum/$1 last;
        }

        try_files $uri $uri/ @rewrite;
}

开始页现在可以工作,但如果有查询字符串,则不会重写任何内容,我不知道为什么。

答案1

经过半天的沉默,我终于找到了答案。通过$request_uri在位置块外部使用 full 并调整正则表达式以使任何字符在后面都是index.php必需的,这样就可以正常工作:

location / {
    try_files $uri $uri/ @rewrite;
}

if ($request_uri ~* "^\/index\.php(.+)$") {
    rewrite ^(.*)$ /forum/$1 last;
}

相关内容