我在设置基本 Nginx / PHP-FPM 网络服务器时复制了这个配置
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;
}
}
它可以正常工作,但是我不明白在为 php 文件提供请求时try_files
in块是如何工作的,例如.
我以为这条线location ~ \.php$ { .... }
domain.com/test.php
try_files $uri =404;
告诉 nginx 继续尝试提供静态文件 - 即附加$uri
到root
目录,如果文件存在 - nginx 只会发送静态文件并且请求会结束,不是吗?因此fastcgi_pass
不会发生?但php-fpm
确实得到它并执行脚本。
为什么不try_files
阻止fastcgi_pass
?
try_files
不告诉nginx
提供静态文件。在没有任何其他操作的情况下到达右大括号会导致它为静态文件提供服务。try_files
测试文件在本地文件系统中是否存在,并可能重写 URL。通过在将 URL 发送到上游解释器之前确保 PHP 文件是真实
try_files $uri =404;
文件来克服特定脚本注入漏洞的许多常见技巧之一也是如此。为什么你认为应该?Nginx 文档没有这样说。
只要找到文件,就正常处理请求,即传递给fastcgi。否则将发送 404。