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文件提供服务时,location ~ \.php$ { .... }块中的try_files是如何工作的,例如domain.com/test.php。我以为这行代码
try_files $uri =404;
告诉Nginx继续尝试提供静态文件 - 即将$uri附加到root目录,如果文件存在 - Nginx将简单地发送静态文件,请求将结束,不是吗?
因此,fastcgi_pass不会发生?但是php-fpm会接收并执行脚本。
为什么try_files不能阻止fastcgi_pass呢?
try_files检查$root$uri是否存在,如果存在,它只是记住它,然后继续处理location块的其余部分。如果没有其他指定如何处理请求/文件的内容,那么nginx会作为最后的选择提供静态文件服务。 - the_velour_fognginx中,一个位置块并不必须包含try_files指令才能从该位置提供静态文件服务。 - Richard Smithtry_files指令,并且它没有匹配到任何文件,那么它会停止当前location block的处理,并使用try_files的最终值生成一个新的内部重定向。 - the_velour_fogtry_files不起作用,明明文件存在,尝试了有无root,尝试了硬编码路径等等...始终都是404错误!你的第一段话对我来说至关重要,终于让我明白了为什么try_files不起作用。我需要先手动进行rewrite,去掉URL的前缀,try_files才能工作。在了解到try_files并不会提供文件服务之后,一切都变得清晰了!非常感谢!+1 - Nuno