宝塔网站目录怎么选:public与伪静态

PHP 项目上传后,首页 403、子页面 404,甚至把配置文件暴露到公网,都可能与目录选错有关。本文面向宝塔 Linux 面板管理的 Nginx、PHP 网站,以入口在 public/index.php 的项目为例。应用应已完成依赖安装,PHP 版本和扩展满足它自己的要求。

并非所有 PHP 程序都使用 public。WordPress 等程序有自己的目录结构,要按真实入口设置;不要给每个网站都机械选一个 /public。

三个路径先对上

假设完整项目放在 /www/wwwroot/baole-demo,其中有 public、vendor、配置文件等内容:

名称 本例设置 含义
网站目录 /www/wwwroot/baole-demo 面板记录的项目部署目录。
运行目录 /public 以网站目录为起点,选择对外提供服务的子目录。
最终对外目录 /www/wwwroot/baole-demo/public Nginx 查找网页入口与公开静态文件的位置。

项目根目录、public运行目录与公网访问范围示意

目录关系示意,路径和项目名均为示例;按自己程序的实际入口填写。

Laravel 这类项目应让 Web 服务使用 public 作为对外根目录。不要把 index.php 移到项目根目录来凑访问路径,也不要把 .env、数据库备份或整个源码仓库放进 public。

在宝塔里修改前,先确认文件确实在那

  1. 保存当前网站目录、运行目录和伪静态规则。已有业务先安排适当维护时间,保留原文件与可恢复的配置。
  2. 通过文件管理或 SFTP 检查完整发布包,确认 public/index.php存在。多解压了一层同名文件夹时,应先找出真正的项目根目录。
  3. 打开“网站”中对应域名的设置,进入“网站目录”。先把网站目录设为项目根目录并点击对应的“保存”;再将运行目录选择为 /public,点击这一项对应的“保存”。
  4. 检查面板是否报告错误,并核对网站实际响应。修改目录不会自动安装依赖、补齐扩展或移动上传文件。

如果网站目录本身已经填到 .../public,又选择一次 /public,就可能指向不存在的 public/public。运行目录下拉框里找不到 public 时,先核对当前网站目录与实际文件,不要创建一个空 public 来消除提示。

首页能打开,子页面404,再检查伪静态

“伪静态”在这里用于把不存在的文件路径交给应用入口处理。先在对应站点的“伪静态”中查看当前规则,选择与程序及版本匹配的方案。Nginx 不会自动执行 Apache 的 .htaccess 文件,仅上传它通常不会生效。

例如 Laravel 常见的根路径路由片段如下,仅适用于该类入口设计。它负责路由转交,站点仍需要正确的 PHP 处理配置:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

已有 location /时应调整原有规则,不能在同一站点重复追加同名段。其他框架可能使用不同的 PATH_INFO 或查询参数约定,不直接照抄。面板保存报语法错误时,先恢复刚才保留的规则并处理报错,不继续叠加配置。

这里只改对应站点的运行目录和路由,不需要替换整份 Nginx 配置。PHP 版本、扩展或 FPM 连接不正确时,按宝塔 PHP 设置与生效检查继续定位。

常见报错,对应不同处理位置

现象 优先检查
403或找不到首页 最终对外目录是否正确、index.php 是否存在,以及 Web 服务读取所需的目录权限。
首页正常,应用路由404 当前请求是否进入正确站点,路由规则是否匹配程序入口。
500或提示缺少依赖 应用日志、vendor 是否完整、PHP 版本和扩展,不把所有异常都归到伪静态。
open_basedir restriction in effect 日志里被拒绝的真实路径,确认本站允许访问的项目范围是否包含所需目录。

运行入口在 public,PHP 程序仍可能需要读取上一级项目里的 vendor、配置等文件。遇到 open_basedir 错误,应针对本站所需路径核对限制范围;不要直接关闭全站保护,也不要递归给全部文件 777。可写目录同样按应用需要单独处理,例如 Laravel 的 storage 和 bootstrap/cache。

保存成功后,再做访问与暴露检查

依次检查首页、一个真实存在的应用路由、一张静态图片,以及登录或表单等实际功能。未知路径应按应用设计返回错误,不能只看首页一次成功。

还要确认 /.env、/.git/config和备份文件不能直接下载。下面只输出响应状态,不打印可能包含敏感内容的响应体;示例域名需要替换为自己管理的网站:

curl -q -sS --max-time 15 -o /dev/null -w '%{http_code}\n' https://app.example.com/.env
curl -q -sS --max-time 15 -o /dev/null -w '%{http_code}\n' https://app.example.com/.git/config

这些敏感文件应不可公开读取。若返回 301、302 等跳转状态,先核对 Location 和完整跳转链,在自己管理的目标上检查最终响应;000 或连接报错表示检查尚未完成。若应用统一返回 200 错误页,不能仅凭状态认定泄露,应在受控环境确认实际响应内容,也不要把配置内容发给别人。浏览器若开始下载 PHP 源码,应先停止对外访问并检查 PHP 处理配置,恢复前确认源码不再暴露。

最后保留本次实际目录与规则的记录。需要回退时恢复刚才保存的目录和站点规则,再验证旧页面与接口,不删除项目文件来“重建一次试试”。