Настройте всеобъемлющий фильтр внутри местоположения с возможностью возврата к index.php

Настройте всеобъемлющий фильтр внутри местоположения с возможностью возврата к 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

Связанный контент