Настройте ловушку внутри местоположения с отступлением к index.php

Я борюсь с конфигом nginx. у меня есть server блок, где я хочу, чтобы все запросы перейти index.php?tags=$uriесли $uri существует (как index.php?a=b или же /?a=b).

Я бы ожидал:

try_files $uri index.php?tags=$uri;

но нет, это было бы слишком просто. Это не работает для /?a=b, который, по-видимому, не найден, поэтому он направляет index.php?tags=/

Может быть, если я явно включу index, что разумно:

index index.php;

Нету. Нет кости. Точно такой же результат по всем направлениям.

Также ничего с $args, $request_uri или комбинации. Тоже не это:

try_files $request_uri/index.php $request_uri index.php?tags=$request_uri; // now I'm just guessing

Apache почему-то знал, что я имел в виду всегда. Почему не nginx? Я хотел бы эти перенаправления (без redirect или же if):

/   => /index.php
/index.php   => /index.php
/index.php?a=b   => /index.php?a=b
/?a=b   => /index.php?a=b
/foo   => /index.php?tags=foo (or /index.php?tags=/foo)
/foo/bar   => /index.php?tags=foo/bar (or /index.php?tags=/foo/bar)
/foo?bar=yes   => /index.php?tags=/foo%3Fbar%3Dyes

Я бы хотел, чтобы строка запроса кодировалась при перенаправлении, но не путь, но на самом деле это не так важно.

(Я также не понимаю практической разницы между $uri и $request_uri. Кажется, они делают то же самое половину времени. Но это на другой день.)

Большое спасибо.

1 ответ

Решение

Я достигаю желаемого результата с помощью следующего фрагмента конфигурации:

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$request_uri;
}

try_files пытается... файлы. Когда ты ищешь / при этом вы ищете файл с тем же именем, это не интерпретируется как "найти индексный файл". index делает эту работу Следовательно, вам необходимо отделить этот особый случай от стандартного запасного местоположения.

Лучшая часть - это ваше последнее желание: аргументы даже не будут закодированы, так как они не нужны (только первый вопросительный знак URI важен, так как все последующее является аргументом в любом случае).

Следите за использованием $request_uri (который содержит запрошенный URI с аргументами, но не нормализует / не очищает его) вместо нормализованного $uri (который очищает URI и удаляет аргументы). Таким образом, вы можете получить:

///foo?bar=yes => index.php?tags=///foo?bar=yes

Если вы не возражаете, вы можете использовать $uri в комбинации с $args:

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$uri?$args;
}

производство:

///foo?bar=yes => index.php?tags=/foo?bar=yes
Другие вопросы по тегам