宝塔面板路由不生效怎么办
学完这篇你能得到什么:能自己定位宝塔面板建站后「除首页外全是 404」的路由问题,并按步骤把配置改对。
第一步:先分清是哪一种「路由不生效」
这一步要确认你遇到的是框架的 URL 重写问题,还是反向代理问题,因为两者的排查入口完全不同。
浏览器按 F12 → Network,访问一个非首页地址,比如 https://你的域名/api/list,看状态码:
- 404,页面是 Nginx 白底黑字的「404 Not Found」 → 伪静态没生效,看第二步。
- 404,但页面是框架自己渲染的(如「控制器不存在」)→ URL 写错或控制器不存在,去查代码。
- 502 Bad Gateway → 后端服务挂了,不是路由问题。
- 接口有返回但页面报错 → 前端路由或 base 路径问题。
注意:先看清楚状态码再动手。很多人一上来就改伪静态,结果实际是 502,白折腾。
第二步:在宝塔里选中正确的伪静态模板
这一步要做的是让 Nginx 把不存在的路径转交给入口文件处理。
登录宝塔面板(Linux 版 8.x),左侧菜单点「网站」,在站点列表找到你的域名,点右侧「设置」,在弹窗顶部切到「伪静态」标签。在「伪静态」下拉框里按框架选择:
- Laravel / Lumen → 选
laravel5 - ThinkPHP → 选
thinkphp - WordPress → 选
wordpress - 其他 → 先选
default,再按第四步手写
选完点「保存」,宝塔会自动写入并重载 Nginx。保存后立刻刷新测试,还不行就进第三步。
注意:如果你手动改过伪静态内容,下拉框会变成「自定义」,切换模板会覆盖手写内容,先备份。
第三步:检查运行目录是否指向 public
Laravel、ThinkPHP 6 等框架的入口文件在 public/ 里,而宝塔默认指向站点根目录,rewrite 规则就匹配到了错误的入口。
仍在这个「设置」弹窗里,切到「网站目录」标签,找到「运行目录」下拉框,从 / 改成 /public,点「保存」。
改完访问首页:首页正常但内页还 404,说明运行目录对了、rewrite 还有问题,继续第四步。
注意:改运行目录后,若「网站目录」里开着「防跨站攻击(open_basedir)」,要把新的 public 路径一并加进去,否则会报「file not found」。
第四步:手写 rewrite 规则
这一步针对宝塔下拉框里没有你所用框架的情况。
在站点「设置」弹窗切到「配置文件」标签,找到 server { } 内的 location / { } 块(没有就自己加一段),改成下面之一后点「保存」:
Laravel:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
ThinkPHP 5/6:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
注意:别删掉
location ~ \.php$那一段,那是 PHP 解析规则,删了整站会变成下载文件。另外配置里不能出现两段location /,Nginx 会报错、重载失败,网站直接打不开。
第五步:手动校验并查看日志
保存后网站打不开,说明配置有语法错误。进宝塔左侧「终端」(或 SSH 登录服务器)执行:
/www/server/nginx/sbin/nginx -t
返回 syntax is ok 和 test is successful 才算通过,然后重载:
/www/server/nginx/sbin/nginx -s reload
路由仍不生效,去看错误日志,路径一般是 /www/wwwlogs/你的域名.error.log,用下面命令实时观察,同时刷新页面:
tail -f /www/wwwlogs/你的域名.error.log
常见报错和处理:
rewrite or internal redirection cycle→ 规则死循环,检查try_files最后一项是不是又指回了自身。open() ".../index.php" failed→ 运行目录或入口文件路径不对,回第三步。Access denied→ open_basedir 或权限问题,执行chown -R www:www /www/wwwroot/你的站点目录。
第六步:排查配置之外的干扰
配置全对却还不行,逐条检查:
- 站点类型。站点被建成了「静态」,或加了「反向代理」转发到 Node/其他端口时,Nginx 的 rewrite 不参与转发,路由要由后端程序自己兜底(如 Express 加
app.get('*'))。 - 缓存。装了 Nginx 缓存或接了 CDN,先清缓存;CDN 上把 HTML 设为不缓存。
- 浏览器。用无痕窗口测,排除 304 缓存干扰。
- 入口文件。如果按某些教程把
index.php改名了,rewrite 还指向它,自然 404。
注意:如果是宝塔面板自身页面点菜单 404,那跟网站路由无关,属面板程序问题,SSH 执行
bt 16修复面板即可,别拿网站的伪静态去套。
小结
- 先看 F12 状态码,区分 404 / 502 / 前端问题,再决定改哪里。
- 框架路由靠「伪静态」+「运行目录」两处,Laravel 必须把运行目录设为
/public。 - 下拉框没有就手写
try_files $uri $uri/ /index.php?$query_string;,并确认没有重复的location /。 - 出错先跑
nginx -t,再看/www/wwwlogs/域名.error.log。 - 站点是静态或反向代理时 rewrite 不生效,路由由后端程序负责。
原文链接:https://www.gj0.com/thread-687.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。