2013-07-22 33 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

相關問題