操作系统:debian 稳定版(squeeze) nginx:squeeze-backports 1.2.1-2~bpo60+1
try_files 对我来说行为很奇怪。
这按预期工作,如果未找到,则在本地尝试 $uri -> 使用 @static 位置
try_files $uri $uri/ @static;
只需在末尾添加 =404 就会导致 404。如果我访问位于 $uri 或 @static 的现有文件,它仍然有效吗?并且只有在 @static 位置未找到任何内容时才会出现 404?
try_files $uri $uri/ @static =404;
将 =404 放在 @static 之前工作再次。为什么?如果文件不在 $uri 或 $uri/ 位置,而是在 @static 上,它应该导致 404,因为 =404 位于 @static 之前(就我的理解而言)。如果我访问位于 $uri 的文件,它将由 nginx 正确提供(不会击中 @static 后端或 =404)
try_files $uri $uri/ =404 @static ;
我很困惑
编辑:我的目标是:测试文件是否在本地,然后检查所有上游服务器中的文件,如果在这些位置找不到该文件,则返回 404
配置:
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 ***
}
答案1
你误解了try_files
参数。引用自文档:
如果没有找到任何文件,则进行内部重定向到最后一个参数指定的 uri。
只有最后一个参数是 fallback URI(或命名位置,或代码),所有其他参数都是要测试的文件。即
try_files /file1 /file2 /file3 ... @fallback;
将检查文档根目录下的文件 (/file1、/file2、/file3 等),如果没有找到,nginx 将执行内部重定向到 @fallback。
这try_files ... @static =404;
实际上没有任何意义,因为它将测试名为 的文件@static
,而这很可能不是您想要的。 这try_files ... =404 @static;
也没有意义,因为它将测试名为 的文件=404
。
请参阅此处的文档:http://nginx.org/r/try_files。
答案2
为了完整性(来自 kolbyjack @ irc #nginx 的回答):
科尔比杰克:您只能获得一个后备方案。无论 @static 还是 =404 哪个先出现,都会被测试是否存在于文件中。这将失败,然后 nginx 会转到后备方案
c33s:我不确定我是否理解,如果我定义多个 try_file 选项,它们不会从左到右进行测试?
科尔比杰克:没错,但除了最后一个之外,其他所有文件都作为磁盘上的文件进行测试。因此,try_files $uri @static =404; 查找 $document_root$uri,然后查找 $document_root@static,如果两者都不存在,则发出 404。try_files $uri =404 @static 查找 $document_root$uri,然后查找 $document_root=404,如果两者都不存在,则内部重定向到 @static
c33s:所以如果@static 不是本地文件系统上的位置,那么它仅作为最后一个选项才有意义?
科尔比杰克:除了最后一个参数之外的所有内容都是正确的,应该是您想要测试其在磁盘上是否存在的东西
c33s:您是否想在 serverfault 上回答以获得声誉?如果不想,我会将您的答案复制到 serverfault 并自己回答我的问题……
科尔比杰克:你去吧,我太忙了