index指令仅在请求uri为目录路径(如/或/blog/)且对应location未显式覆盖、未绕过文件系统查找时生效,按server块内配置顺序匹配首个存在且可读的索引文件。

在 server 块中配置 index 指令,会对该 server 下所有未显式覆盖的 location 生效,但仅在满足“目录索引触发条件”时才实际起作用。
index 指令的作用前提
index 不是默认始终生效的“继承型指令”,它只在以下情况被触发:
- 请求 URI 指向一个**目录路径**(如
/、/blog/),且末尾带斜杠或隐式为目录 - Nginx 尝试在该目录下查找匹配的索引文件(如
index.html、index.php) - 对应 location 中未用
index重新定义,也未用try_files或proxy_pass等指令绕过文件系统查找
对不同 location 类型的实际影响
子 location 是否受 server 级 index 影响,取决于其内部行为:
-
普通前缀 location(如
location /static/ { ... }):若其中未设index,且请求为/static/(结尾斜杠),则使用 server 级定义的 index 文件列表 -
正则 location(如
location ~ \.php$):通常不处理目录请求,index指令在此类 location 中不会被触发,server 级设置无实际效果 -
proxy_pass / fastcgi_pass location:请求直接转发,不查本地文件系统,
index完全不参与,server 级设置被忽略 -
含 try_files 的 location:优先执行
try_files列表,只有当列表中出现/(如try_files $uri $uri/ /index.html)且匹配到目录时,才会回退到index指令逻辑——此时仍使用 server 级定义
常见误操作与建议
容易混淆的是把 index 当作“默认返回文件”全局生效。实际上它只是目录访问时的后备文件查找规则:
- 不要在
http块中写index—— Nginx 启动会报错,该指令不支持此作用域 - 若多个 location 共享同一 root,但索引偏好不同(如 API 接口不希望返回 index.html),应在对应 location 内显式设
index off;或指定不同文件 - 想让所有以
/结尾的请求都尝试找index.html,确保 location 未禁用文件查找(例如没加internal;或proxy_pass)











