Назад | Перейти на главную страницу

Попытка использовать Nginx try_files для эмуляции Apache MultiViews

Я хочу запрос http://example.com/foobar возвращаться http://example.com/foobar.jpg. (Или .gif, .html,. Любого другого)

Это тривиально сделать с Apache MultiViews, и кажется, что это будет так же легко и в Nginx. Этот вопрос похоже, подразумевает, что это было бы легко, как try_files $uri $uri/ index.php; в блоке местоположения, но это не работает.

try_files $uri $uri/ =404; не работает, и не работает try_files $uri =404; или try_files $uri.* =404; Перемещение между моими location / { block и регулярное выражение, которое соответствует изображениям, не имеет никакого эффекта.

Крайне важно, try_files $uri.jpg =404; делает работают, но только для файлов .jpg, и выдает ошибку конфигурации, если я использую более одного правила try_files в блоке местоположения!

Электрический ток server { блок:

server {
        listen   80;
        server_name     example.org www.example.org;
        access_log  /var/log/nginx/vhosts.access.log;
        root   /srv/www/vhosts/example;
        location / {
                root   /srv/www/vhosts/example;
        }

        location ~* \.(?:ico|css|js|gif|jpe?g|es|png)$ {
                expires max;
                add_header Cache-Control public;
                try_files $uri =404;
        }
}

Версия Nginx - 1.1.14.

Вы можете эмулировать MultiViews Apache, передавая различные имена файлов, чтобы попытаться try_files.

Nginx's try_files Директива делает именно то, что предполагает название - она ​​пробует файлы в указанном порядке и, если не найдена, переходит к следующему файлу. Обычно последняя запись - это резервный вариант, который гарантированно работает - либо именованный блок местоположения, либо страница с ошибкой.

Часто наблюдаемые параметры try_files: $uri и $uri/ на самом деле пути, переданные в nginx - с косой чертой в конце и без нее.

Итак, если вы перейдете в example.com/path/to/myfile

$uri = /path/to/myfile
$uri/ = /path/to/myfile/

С try_files $uri $uri/ директива, nginx попробует именно то, что передано ($uri) - и если этот файл существует, будет обслуживать его, в противном случае попытается найти подходящий каталог ($uri/) и подавать его (используя любой указанный вами индекс).

Поскольку файлы, которые вы пытаетесь обслуживать, на самом деле не соответствуют пути в $uri, вам нужно добавить расширение к $uri чтобы он работал:

$uri.jpg будет соответствовать (из приведенного выше примера) myfile.jpg - поэтому, когда вы его использовали, работали только JPEG.

Поскольку вы можете указать несколько файлов для проверки try_files, имея более одного try_files Директива на самом деле не имеет смысла - вот почему она не разрешена.

Поэтому в простейшей форме просто перечислите нужные вам файлы в том порядке, в котором вы хотите их попробовать (например,):

try_files $uri.jpg $uri.gif $uri.png $uri.css $uri.js $uri/ =404

В данном случае интересен второй блок локации. Как правило, nginx обрабатывает только один блок местоположения - наиболее подходящий. Однако в случае rewrite ... last обработка перезапустится и проверит все доступные блоки местоположения. Это по сути то, что try_files составляет - проверьте, существует ли и rewrite ... last, ключевым отличием является отсутствие переданных аргументов, которые удаляются try_files если явно не добавлено (например, с $uri?$args).