index指令仅查找索引文件,不支持重定向;若索引文件不存在,默认返回403而非404;需用try_files实现重定向:如try_files $uri $uri/ /index.html用于SPA,或=404显式返回404状态码。

Nginx 的 index 指令本身不支持重定向,它只负责在请求目录时,按顺序查找指定的索引文件(如 index.html)。如果这些文件都不存在,且 autoindex off(默认),Nginx 就会返回 403 Forbidden(不是 404),这是它的默认安全行为——防止目录遍历。
你想实现“找不到 index 文件就重定向”,真正该用的是 try_files,而不是依赖 index。
✅ 正确做法:用 try_files 替代或配合 index
try_files 能主动控制查找流程,并在全部失败时触发内部重定向(URI 形式),从而实现你想要的效果。
1. 让所有未命中路径都回退到 /index.html(常见于 SPA)
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}-
$uri:找精确匹配的文件(如/about.css) -
$uri/:找同名目录,然后按index指令查找索引文件(仍受index index.html;影响) -
/index.html:兜底,内部重定向到该 URI(浏览器地址栏不变,状态码为 200)
⚠️ 注意:这会让所有 404 请求都显示
index.html,SEO 不友好。如需保持 404 状态码,见下文。
2. 显式返回 404(推荐用于静态站点)
location / {
root /var/www/html;
try_files $uri $uri/ =404;
}- 所有路径都不匹配时,直接返回标准 404 响应(状态码 404,不跳转)
3. 自定义 404 页面(状态码仍是 404,但展示友好内容)
location / {
root /var/www/html;
try_files $uri $uri/ /404.html;
}
location = /404.html {
internal; # 防止用户直接访问 /404.html
root /usr/share/nginx/html;
}
error_page 404 /404.html;-
try_files把失败请求内部重写到/404.html -
error_page 404 /404.html确保真实 404 也走同一页面 -
internal保证该页面只能被内部跳转访问
4. 重定向到其他 URL(301 或 302)
error_page 404 =302 https://example.com/not-found;
- 浏览器地址栏会变,状态码是 302(临时)或
=301(永久) - 适合维护期跳转、域名迁移等场景
❌ 不要这样做:只靠 index 指令实现跳转
# 错误示例 —— index 不会跳转,也不会返回 404
location / {
root /var/www/html;
index index.html; # 若 index.html 不存在,直接 403
}这个配置下:
- 请求
/→ Nginx 查/var/www/html/index.html - 文件不存在 → 返回 403(不是你想要的跳转)
- 它不会自动 fallback,也不会重定向
? 顺便检查几个关键点
- 确保
index.html真的存在,且 Nginx 进程用户(如www-data)有读权限 - 父目录要有执行权限(Linux 下
chmod 755 /var/www/html) - SELinux 启用时(如 CentOS),确认文件上下文为
httpd_sys_content_t - 修改后务必
nginx -t && nginx -s reload验证并重载
不复杂但容易忽略


















