try_files在这个nginxconfiguration中做了些什么?

设置基本的Nginx / PHP-FPMnetworking服务器时,我复制了这个configuration文件

server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.php index.html index.htm; server_name server_domain_name_or_IP; location / { try_files $uri $uri/ =404; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 

它工作,因为它应该,但我不明白如何try_fileslocation ~ \.php$ { .... }块服务请求的PHP文件,如domain.com/test.php
我以为这一行

 try_files $uri =404; 

告诉nginx继续前进,尝试服务于静态文件 – 即追加$uriroot目录,如果文件存在 – nginx将简单地发送静态文件,请求将不会是吗? 因此fastcgi_pass不会发生? 但php-fpm确实得到它并执行脚本。
为什么try_files不能防止fastcgi_pass

try_files不告诉nginx提供静态文件。 在没有任何其他操作的情况下触及右大括号会导致它为静态文件提供服务。 try_filestesting本地文件系统中是否存在该文件,并可能重写URL。

所以try_files $uri =404; 是通过在将URL发送到上游解释器之前确保PHP文件是真实文件来克服特定的脚本注入漏洞的众多常用技巧之一。

你为什么这么认为呢? nginx文档没有这样说过。

以指定顺序检查文件的存在,并使用第一个find的文件进行请求处理; 处理在当前上下文中执行。 […]如果找不到任何文件,则将内部redirect到最后一个参数中指定的uri。

只要find文件,请求就会正常处理,即传递给fastcgi。 否则,404将被发送。