伪静态失效与 404、301 异常
详情页 404、http 不跳 https、不带 www 不跳转的自查与修复,含 Nginx 伪静态与 301 规则。
一、现象与判断
- 首页正常,但
/bendi/12.html、分类短码/fc/等地址打开返回 404; - 已配 HTTPS,访问
http://却不自动跳到https://; - 访问不带 www 的域名不会跳转到带 www;
- 自定义 404 页面不生效。
先分清是“伪静态没生效”还是“这个内容本身不存在”。把地址改成 index.php?__route=/bendi/12.html 直接访问:若能打开,说明数据存在、问题出在伪静态规则;若仍是 404,则内容或路由本身有问题。
二、检查伪静态
本系统走 index.php 单入口,由 config/routes.php 决定路由,Nginx 负责把不存在的路径交给入口文件:
location / {
try_files $uri /index.php?__route=$uri&$args;
}
在宝塔面板的「网站 → 你的站点 → 伪静态」中粘贴规则并保存,或让站点配置引入规则文件,改完先测试再重载:
nginx -t && nginx -s reload
规则未生效的常见原因:根本没有配置伪静态、保存后没有重载 Nginx、把规则放到了别的站点、root 指向的不是站点根目录(应为 /www/wwwroot/你的域名)。
三、404 的其它来源
- 分类目录短码被改过,或分类已被删除,旧地址自然 404;
- 内容已过期删除,但搜索引擎仍保留旧链接;
- 站点对
/data/、/install/、/docs/、/config/等内部目录做了访问拦截,直接访问这些路径返回 404 或 403 属于预期行为。
四、301 跳转不生效
旧教程里的 web.config 规则在 Nginx 上无效,应写到站点配置中。http 强制跳 https:
server {
listen 80;
server_name 你的域名 www.你的域名;
return 301 https://$host$request_uri;
}
不带 www 跳带 www(写在 443 的 server 块内):
if ($host = '你的域名') {
return 301 https://www.你的域名$request_uri;
}
多个旧域名统一跳到主域时,可用一条 server_name 列出全部域名再 return 301,比逐条 rewrite 更好维护。
五、自定义 404 页面
在站点配置中指定错误页并交给入口处理:
error_page 404 /index.php?__route=/404;
配好后用命令核对状态码:
curl -I http://你的域名/bendi/999999.html
curl -I http://你的域名
提示:301 是永久跳转,会被浏览器和搜索引擎长期缓存。规则没确认好之前先用 302 测试,避免改错后长期难以回退。
六、快速自查清单
- 访问
/data/、/install/、/docs/、/config/这类内部目录返回 404 或 403,是访问拦截在生效,属预期行为; - 伪静态规则是否粘贴到本站点,保存后是否执行过
nginx -t与重载; root是否指向/www/wwwroot/你的域名,index.php是否位于站点根目录;- 301 是否只跳一次、目标的协议与域名是否与证书一致,避免跳转链;
- 改完用
curl -I复核状态码,再提交搜索引擎更新收录。