nginx 通过 index 指令配合 try_files 和 php location 块实现目录自动执行 index.php:index 指令仅匹配文件,需 try_files 触发重写,再由 location ~ .php$ 交由 php-fpm 执行。

Nginx 本身不支持像 Apache 那样用 DirectoryIndex 自动解析 PHP 动态脚本作为默认首页(比如自动把 index.php 当作目录索引),但可以通过 index 指令配合 try_files 和 FastCGI 传递,实现“访问目录时自动执行指定 PHP 脚本”的效果。关键不是让 index “直接运行” PHP,而是让它触发后续的 PHP 处理流程。
index 指令只负责匹配文件名,不执行脚本
index 指令的作用是:当用户请求一个目录(如 / 或 /admin/)时,Nginx 会在该目录下按顺序查找列出的文件名,并返回第一个存在的静态文件(如 index.html)。它本身不会执行 PHP,也不会触发 FastCGI —— 这需要额外配置。
所以单纯写 index index.php; 是不够的,必须确保:
- 请求最终能被发往 PHP-FPM(通过
fastcgi_pass) - PHP 脚本路径能被正确解析(通常靠
try_files或location ~ \.php$捕获)
正确做法:index + try_files + PHP location 联动
推荐写法(在 server 或 location 块中):
index index.php;
<p>location / {
try_files $uri $uri/ /index.php?$query_string;
}</p><p>location ~ .php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; # 或 unix:/var/run/php/php8.1-fpm.sock
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}</p>
说明:
-
index index.php;让 Nginx 在目录请求时尝试找index.php -
try_files $uri $uri/ /index.php?$query_string;表示:先找真实文件 → 再找目录(触发 index)→ 否则重写为/index.php并带上查询参数 - 后面的
location ~ \.php$捕获所有以.php结尾的请求(包括重写来的/index.php),交给 PHP-FPM 执行
如果只想对某个子目录启用动态首页
例如仅让 /app/ 下访问目录时执行 app/index.php:
location /app/ {
index index.php;
try_files $uri $uri/ /app/index.php?$query_string;
}
<p>location ~ ^/app/.*.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}</p>
注意:SCRIPT_FILENAME 必须拼出绝对路径,$document_root$fastcgi_script_name 能正确映射到磁盘上的 PHP 文件(如 /var/www/html/app/index.php)。
常见坑点提醒
以下问题会导致 index.php 不执行,只被下载或 404:
-
fastcgi_param SCRIPT_FILENAME写错(比如漏掉$document_root,导致路径不完整) - 没有
try_files或 location 匹配规则,导致请求停在index.php文件本身(Nginx 默认不执行 PHP) - PHP-FPM 未运行,或 socket/port 不通
-
index指令放在错误作用域(比如写在http块里却没被具体server继承)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











