Я хочу запрос 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
).