我是 Nginx 的新手,看到指南告诉我如果我这样做:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
那么我的理解是,如果客户要求:
/uploads/myavatar.gif/ascript.php
并且ascript.php
未找到,FastCGI 将开始检查路径中是否有某个部分真正与文件匹配。这样,假设:
/uploads/myavatar.gif
因为有人上传了该文件而存在,该文件将被视为具有 PATH_INFO 中 $uri 的剩余部分。因此,“/script.php”将是 PATH_INFO 中“gif 文件”或 ab 的值碳y PHP 文件是否有其他扩展名?
因此,为了避免出现此类警告,建议使用以下解决方案:
location ~ \.php$ {
try_files $uri $uri/ =404;
fastcgi_pass 127.0.0.1:9000;
}
我的理解是try_files
将检查每个替代文件规范并且:
- 最后一个规范必须存在,否则将抛出 500。
- 最后的规范必须是带有等号的错误代码。
- 最后的规范必须是另一个声明的@location(例如,可以是“_pass”。
我以为我理解了但似乎我理解的不正确是:根据指令检查文件root
(即 try_files 通过检查最近的root
目录并附加每个文件规范来工作)。所以,我的想法是这样的:
root /var/nginx/www;
#assume this directory exists
location ~ \.php$ {
try_files $uri $uri/ =404;
fastcgi_pass 127.0.0.1:9000;
}
#each uri would be tested like root$uri, root$uri/, or fail with =404
但如果这是逻辑的话,在新的观点下我不认为这是正确的,那么:
- 将测试 .php 是否存在于给定的根目录中。
- 如果它不是文件也不是目录,则会失败并出现 404。
- 如果没有失败,则将相同的路径传递给 fastcgi。
我的问题是:
- 当评估每个文件替代方案并且有 proxy_pass 或 fast_cgi 传递时,try_files 如何工作?我似乎对它的工作原理有错误的印象。
root
关于文件检查,在有指令和有指令之间谁优先?(此外,我对基于 python 的项目安装 - 每个 - 本地服务器的fastcgi_pass
可能性很感兴趣)。proxy_pass
gunicorn
答案1
try_files
是一个简单的文件存在性检查器。它只是检查文件 ( $uri
) 或目录 ( $uri/
) 是否存在。
如果两者都不存在,则返回 404 错误。
如果文件存在,则继续执行下一行,即fastcgi_pass
或proxy_pass
或已配置的任何其他内容。
因此,的行为与或try_files
是否存在无关。fastcgi_pass
proxy_pass
try_files
总是使用root
指令来检查文件的存在。
然后,解决通过 .gif 文件可能利用的原始问题的方法是在 PHP 位置块中包含此指令:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
您还需要cgi.fix_pathinfo
在 php.ini 中将其设置为 false。
这样,PHP 就会获取正确的 PHP 文件名作为要执行的脚本。