Назад | Перейти на главную страницу

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;
}

Начальная страница сейчас работает, но если есть строка запроса, ничего не переписывается, и я не знаю почему.

После полудня молчания я в этом разобрался. Используя полную $request_uri вне блока местоположения и корректировка регулярного выражения, чтобы любой символ после index.php обязательно нормально работает:

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

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