奇怪的行为与nginx的try_files。 我的configuration有什么问题?

操作系统:debian稳定(挤压)nginx:挤压backports 1.2.1-2〜bpo60 + 1

try_files对我来说很陌生。

这符合预期,如果没有find$ uri,则尝试使用localy – >使用@static位置

try_files $uri $uri/ @static; 

如果我访问现有的文件位于$ uri或@static,并且只有在@static位置没有find任何文件时才提供404,那么只需在末尾添加= 404就可以了。

 try_files $uri $uri/ @static =404; 

在@static重新开始工作之前放置= 404。 为什么? 如果文件不是位于$ uri或$ uri /位置,而是位于@static,则应该导致404,因为= 404是@static(为了我的理解)。 如果我把访问一个位于$ uri的文件,它是从nginx正确的服务(不击中@static后端或= 404)

 try_files $uri $uri/ =404 @static ; 

我很困惑

编辑:我的目标是:testing如果文件是本地的,然后检查所有上游服务器的文件,如果没有在这些位置find返回404

configuration:

 upstream domain.com_upstream { server yyy.yyy.yyy.yyy:8000 weight=10 max_fails=3 fail_timeout=3s; server zzz.zzz.zzz.zzz:8020 weight=10 max_fails=3 fail_timeout=3s; } server { server_name www.domain.com; listen xxx.xxx.xxx.xxx:80; location @static { proxy_ignore_client_abort off; proxy_intercept_errors on; proxy_next_upstream http_404 error timeout invalid_header; proxy_pass http://domain.com_upstream; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 10; proxy_send_timeout 120; proxy_read_timeout 120; proxy_buffers 8 16k; proxy_buffer_size 32k; } location ~ ^/test { root /var/www/test; try_files $uri @static =404; # exchange with upper try_file examples... } *** snip *** } 

你误解了try_files参数。 从文档引用:

如果找不到任何文件,则将内部redirect到由最后一个参数指定的uri。

只有最后一个参数是一个后备URI(或一个命名的位置,或一个代码),所有其他参数是要testing的文件。 即

 try_files /file1 /file2 /file3 ... @fallback; 

将检查文件根目录(/ file1,/ file2,/ file3等)下的文件,如果没有发现,nginx会做一个内部redirect到@fallback。

try_files ... @static =404; 没有什么意义,因为它会在文档根目录下testing一个名为@static的文件,很可能它不是你想要的。 try_files ... =404 @static; 也没有意义,因为它将testing名为=404的文件。

看到这里的文档: http : //nginx.org/r/try_files 。

为了完整性(从kolbyjack @ irc #nginx回答):

kolbyjack :你只能得到一个回退。 无论哪个@static或= 404是第一个被testing的存在作为一个文件。 这将失败,并且nginx继续后退

c33s :我不知道我明白,如果我定义多个try_file选项,他们没有从左到右的testing?

kolbyjack :对,但是除了最后一个以外,都是作为磁盘上的文件进行testing的。 所以try_files $ uri @static = 404; 查找$ document_root $ uri,然后$ document_root @ static,如果两者都不存在,则发出404。try_files $ uri = 404 @static查找$ document_root $ uri,然后$ document_root = 404,如果两者都不那些存在,内部redirect到@静态

c33s :所以如果@static不是本地文件系统上的一个位置,那么最后一个选项才有意义?

kolbyjack :更正一切,但最后一个参数应该是你想要testing的存在磁盘上的东西

c33s :你想在serverfault上得到rep吗? 如果不是,我会复制你的答案到serverfault并自己回答我的问题…

Kolbyjack :来吧,我太忙了