2013-07-22 4 views
34

Я пытаюсь понять, как работает директива try_files от nginx. nginx работает на моем сервере и обслуживает страницу по умолчанию, расположенную по адресу /usr/share/nginx/html/index.html.Как я могу сделать эту директиву try_files?

Однако, у меня есть простая html-страница, расположенная в файловой системе по адресу /var/www/test/index.html. Следующий файл конфигурации не заставляет этот файл обслуживаться. Я хотел бы понять, почему нет, и какое изменение мне нужно сделать, чтобы оно было подано.

Вот соответствующая часть defualt.conf:

server { 
    listen  80; 
    server_name localhost; 

    root /var/www; 
    try_files /test/index.html /; 

    location/{ 
     root /usr/share/nginx/html; 
     index index.html index.htm; 
    } 
+0

Что вы имели в виду в конце '/' в строке 'try_files'? –

+0

Значение опции возврата - «/». Персонаж перед «;» в этой строке. – Jonah

+0

Ну, он должен быть файлом, а не URI, поэтому используйте $ uri/или use /index.html –

ответ

115

очень распространенная try_files линия, которая может быть применена на вашем состоянии является

location/{ 
    try_files $uri $uri/ /test/index.html; 
} 

вы, вероятно, понять первая часть, location / матчи все местоположения, если это не соответствует более конкретному местоположению, например location /test, например

Вторая часть (try_files) означает, что когда вы получаете URI, который соответствует этому блоку, попробуйте сначала $uri, например, http://example.com/images/image.jpg nginx попытается проверить, есть ли файл внутри /images под названием image.jpg, если он будет первым в этом обслуживаться.

Второе условие $uri/ что означает, если вы не нашли первое условие $uri попробовать URI в качестве каталога, например http://example.com/images/, ngixn будет первым проверить, если файл с именем images существует, то он не найдет его, а затем переходит к второй проверить $uri/ и посмотреть, существует ли каталог с именем images, тогда он попробует его обслуживать.

Примечание стороны: если у вас нет autoindex on вы, вероятно, получите 403 запрещенную ошибку, потому что список каталогов запрещен по умолчанию.

EDIT: Я забыл упомянуть, что если у вас есть index определено, Nginx будет пытаться проверить, если индекс находится внутри этой папки перед тем пытается листинг каталога.

Третье условие /test/index.html считается падением назад вариантом, (вы должны использовать как минимум 2 варианта, один и падение назад), вы можете использовать столько, сколько вы не можете (не читали сужение раньше) , nginx будет искать файл index.html внутри папки test и обслуживать его, если он существует.

Если третье условие выходит из строя, то nginx будет служить странице ошибки 404.

Кроме того, есть нечто, называемое названные места, как это

location @error { 
} 

Вы можете назвать его try_files как этот

try_files $uri $uri/ @error; 

TIP: Если у вас есть только 1 условие, которое вы хотите служить, например, внутри папки images вы хотите либо обслуживать изображение, либо перейти к ошибке 404, вы можете написать такую ​​строку

location /images { 
    try_files $uri =404; 
} 

, что означает служить либо файл или служить 404 ошибку, вы не можете использовать только $uri на это сам без =404, потому что нужно иметь запасной вариант.
Вы также можете выбрать, какой когда-либо код ошибки вы хотите, как, например:

location /images { 
    try_files $uri =403; 
} 

Это покажет запрещенную ошибку, если изображение не существует, или если вы используете 500 будет показывать ошибку сервера и т.д. ..

+0

Спасибо за это объяснение. В частности, что не так с кодом в моем OP? Я смог заставить его работать, поставив try_files в блок местоположения и используя названный резерв. Запрещены ли директивы try_files вне блоков местоположения? Или проблема в том, что в моем коде в OP резервное копирование является «/»? – Jonah

+0

ok Я только что проверил документацию, http://wiki.nginx.org/HttpCoreModule#try_files, видимо, это будет работать вне блока местоположения, поэтому я думаю, проблема в том, что у вас не было резервной опции. –

+0

Это объяснение очень полезно! – skyfree

 Смежные вопросы

  • Нет связанных вопросов^_^