我在设置基本的 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
?
答案1
try_files
不会告知nginx
提供静态文件。在没有任何其他操作的情况下到达右括号会导致它提供静态文件。try_files
测试本地文件系统中是否存在该文件,并可能重写 URL。
因此,try_files $uri =404;
通过确保 PHP 文件是真实的 文件,然后再将 URL 发送到上游解释器。
答案2
您为什么认为应该如此?Nginx 文档没有说那样的话。
按指定顺序检查文件的存在,并使用找到的第一个文件进行请求处理;处理在当前上下文中执行。[...] 如果没有找到任何文件,则进行内部重定向到最后一个参数指定的 uri。
只要找到文件,请求就会被正常处理,即传递给 fastcgi。否则将发送 404。