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