2013-07-22 34 views
34

我想了解nginx的try_files指令是如何工作的。 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

含义fallback选项是“/”。 “;”之前的字符在那一行。 – Jonah

+0

它需要是一个文件,而不是一个URI,所以使用$ uri /或者使用/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 Forbidden错误,因为目录列表默认情况下禁止。

编辑:我忘了提,如果你有index定义,nginx的将尝试检查,如果该文件夹中存在的指数 之前尝试目录列表。

第三个条件/test/index.html被认为是一个回落的选项,(你需要使用至少2种选择,一是和回退),你可以使用尽可能多的,你可以(从未读过一收缩) ,nginx将在文件夹test内查找文件index.html,并在存在时提供该文件。

如果第三个条件也失败,那么nginx将提供404错误页面。

也有一些所谓的命名位置,这样

location @error { 
} 

你可以用try_files这样调用

try_files $uri $uri/ @error; 

提示:如果你只有你想为1分的条件,例如,在文件夹images中,您只想提供图片或转至404错误,您可以写出类似这样的行

location /images { 
    try_files $uri =404; 
} 

这意味着无论是提供服务的文件或服务于一个404错误,你不仅可以通过$uri它的自我而不=404,因为你需要有一个退而求其次的选择使用。
您也可以选择你想要的曾经的错误代码,例如像:

location /images { 
    try_files $uri =403; 
} 

这将显示一个禁止错误,如果不存在图像,或者如果您使用500,它会显示服务器错误等..

+0

感谢您的解释。具体来说,我的OP中的代码有什么问题?我可以通过将try_files放入一个位置块并使用一个名为fallback的方法来实现它。在位置块之外是否允许try_files指令?或者是在我的代码中的后备是一个“/”的问题? – Jonah

+0

好吧,我刚刚检查了文档,http://wiki.nginx.org/HttpCoreModule#try_files,显然它会在位置块外工作,所以我想问题是你没有后备选项。 –

+0

这个解释非常有帮助! – skyfree

相关问题