Re: добавление слэшей в конец адресов без оных
Maxim Dounin
mdounin на mdounin.ru
Вт Дек 7 05:33:03 MSK 2010
Hello!
On Mon, Dec 06, 2010 at 08:47:00PM -0500, anon wrote:
> Уже который раз задаюсь этим вопросом,
> спрашивал то там, то здесь. Но никто так
> и не смог предложить рабочий способ.
>
> Где-то видел потенциально возможные
> варианты:
> [code]if (!-e $request_filename)
> {
> rewrite ^/(.*[^/])$ $1/ permanent;
> }[/code]
>
> [code]location ~ ^(.*[^/])$ {
> if (!-e $document_root/$1) {
> rewrite ^(.*) $1/ permanent;
> }
> }[/code]
>
> А как нужно правильно? Чтобы и
> физические файлы читались, и редирект
> работал корректно.
Как-то так, чтобы и файлы отдавались, и статические индексы в
каталогах работали, а для всего что не найдено - редирект с
добавлением / и на бекенд (не проверял, но должно работать):
location / {
try_files $uri @redirect;
}
location ~ /$ {
try_files $uri/index.html @fallback;
}
location @redirect {
rewrite ^ $uri/ permanent;
}
location @fallback {
fastcgi_pass/proxy_pass/...
}
Для 0.7.1 .. 0.8.41 понадобится ещё
location = / {
try_files $uri/index.html @fallback;
}
Если статические индексы в каталогах не нужны - соответствующий
try_files ... @fallback можно заменить на fastcgi_pass/... сразу.
Ну и соответственно location @fallback убрать за ненадобностью.
Можно ещё то же самое сделать через error_page 404, будет немного
быстрее и чуть-чуть надёжнее (на 1 syscall меньше, и нет
возможности для race'а при удалении статических файлов), но конфиг
получится чуть сложнее.
А вот if'ы использовать не надо, оно тут всяко хуже try_files, а в
зависимости от ситации может так стукнуть - мало не покажется.
Don't do it, it hurts. http://wiki.nginx.org/IfIsEvil
Maxim Dounin
Подробная информация о списке рассылки nginx-ru