—
—
| 现象 | 最常见的根因 | 怎么确认 |
|---|---|---|
| 301 → 带斜杠 → 403 | 路径名是真目录,try_files $uri $uri/ 触发目录重定向,目录里又没有 index 文件 | ls /var/www/站点/该目录 看有没有 index.html |
| 重定向次数过多 | 精确 location 的 301 与 try_files 内部重定向互相套娃 | 脚本里看 Location 是不是回到上一个地址 |
| 干净 URL 404,带 .html 正常 | try_files 少写 $uri.html | 补上 try_files $uri $uri.html $uri/ =404; |
| .html 被 301 到错的干净 URL | location 里用 if 做正则判断,覆盖了 $1 捕获组 | 把 if 判断移出该 location,或改用 map |
| 某个前缀路径没走预期的 location | 正则 location 抢在 ^~ 前缀前命中(^~ 会压制正则,但普通前缀不会) | nginx -T | grep -n location 看顺序与类型 |
| 403 且日志写 forbidden by rule | deny 规则或文件权限 | 看 error log 的具体行,别猜 |
1 · 后台地址一直是 403。/admin 被 301 到 /admin/,而 /admin/ 是真实目录(里面放着 data/),没有 index 文件 → 403 白屏。只有 /admin.html 能进。
2 · 修法是内部改写,不是加 index。rewrite ^/admin/?$ /admin.html last; 让 /admin 和 /admin/ 都直达文件,登录保护一层不变。
3 · 语法检查查不出这类问题。nginx -t 只看语法,重定向链、目录索引这类逻辑错误它全绿。改完必须真发请求看状态码和跳数。
4 · 成对测。/x 与 /x/ 是两个不同的 URI,命中规则可能不同,两边都要 200。