nginx 访问目录时默认返回静态索引文件,要执行脚本需配合 location 匹配与 fastcgi_pass 等配置;仅用 index 指令无法执行 php,必须通过 location ~ .php$ 规则触发 fastcgi 处理,或用 try_files 实现目录请求统一路由至入口脚本。

当用户访问一个目录(比如 /api/ 或根路径 /)时,Nginx 默认不会“执行”脚本,而是尝试返回一个静态索引文件。要实现“访问目录时自动执行特定脚本”,本质是让 Nginx 将该请求交给后端处理器(如 PHP、Python 或其他 FastCGI/代理服务)来动态处理,而不是直接展示文件列表或返回静态 HTML。
index 指令本身不执行脚本,只指定默认文件名
index 指令的作用是:当请求一个目录(URI 以 / 结尾)时,Nginx 会在该目录下按顺序查找指定的文件名,并返回第一个存在的文件。例如:
-
index index.php index.html;→ 先找index.php,存在就返回它(注意:只是返回文件内容,不自动执行) - 但若想真正“执行”
index.php,必须配合location ~ \.php$这类能触发 FastCGI 处理的规则
让目录访问触发脚本执行的关键:location 匹配 + fastcgi_pass
单纯写 index index.php; 不足以执行 PHP 脚本——Nginx 必须知道“如何处理 .php 文件”。正确做法是:
- 确保
location ~ \.php$块已正确定义,并包含fastcgi_pass、fastcgi_param SCRIPT_FILENAME等必要参数 - 同时,在目标目录的
location中启用index,并允许目录索引(可选):
(示例:访问/admin/自动执行/var/www/admin/index.php)
location /admin/ {
root /var/www;
index index.php; # 查找 index.php
}
<p>location ~ .php$ {
root /var/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}</p>
进阶:目录请求直接路由到脚本(无需物理 index.php 文件)
如果希望任何对目录的访问(如 /api/)都统一由某个入口脚本处理(类似 Laravel 的 public/index.php),应使用 try_files 配合重写:
-
try_files $uri $uri/ /api/index.php?$args;表示:先找真实文件,再找目录,最后回退到/api/index.php并透传查询参数 - 这样即使访问
/api/users(无对应文件),也会被交给index.php执行,由 PHP 路由逻辑处理
location /api/ {
alias /var/www/api/;
index index.php;
try_files $uri $uri/ /api/index.php?$args;
}
<p>location ~ ^/api/index.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass 127.0.0.1:9000;
}</p>
常见误区提醒
以下配置是无效或危险的:
-
index /path/to/script.php;——index只接受文件名(不带路径),且不支持绝对路径 - 仅写
index index.php;却没配 PHP 处理器 → 浏览器会直接下载或显示 PHP 源码(严重安全风险) - 用
autoindex on;替代脚本执行 → 这只是列出目录文件,不运行任何逻辑











