
Я борюсь с конфигурацией 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