ThinkPHP 5.1 子目录部署需协同配置路径解析、URL重写和入口定位:Web根目录必须指向public/,设置base_url为子目录路径,配置匹配的伪静态规则,并通过view_replace_str或url()助手补全静态资源前缀。

http://example.com/myapp/)不调整,大概率出现 404、静态资源加载失败、路由错乱或白屏。
public 目录必须作为 Web 根目录
TP5.1 强制要求 Web 服务器的文档根(DocumentRoot)指向 public/ 目录,而不是项目根目录。这是安全前提,也是路径逻辑起点。
- 如果当前是
/var/www/html/myproject/整个目录被设为网站根,需改为仅指向其下的/var/www/html/myproject/public/ - Nginx 示例:
root /var/www/html/myproject/public;;Apache 则在虚拟主机中设置DocumentRoot "/var/www/html/myproject/public" - 若无法修改服务器根目录(如共享主机限制),则必须启用
url_pathinfo并配合伪静态规则,但稳定性下降,不推荐
调整 app.php 中的 URL 配置项
当站点运行在子目录下(如 /myapp/),框架需要知道“我在哪”,否则生成的 URL(跳转、静态资源链接、AJAX 地址)会漏掉前缀。
- 打开
config/app.php,设置'base_url' => '/myapp/'(结尾带斜杠) - 同时确认
'url_common' => false(关闭普通 URL 模式,强制使用 PATHINFO 或兼容模式) - 若使用 PATHINFO 路由,确保
'url_pathinfo_depr' => '/'与实际分隔一致(默认即可) - 不要动
app_name或module_name来模拟子目录——这属于模块划分,和部署路径无关
重写规则必须适配子目录路径
伪静态规则要告诉 Web 服务器:“所有以 /myapp/ 开头的请求,都交给 public/index.php 处理”,否则路由无法捕获。
- Nginx(推荐):在 location 块中加
rewrite ^/myapp/(.*)$ /myapp/index.php/$1 last;,并在 index.php 后配置fastcgi_param SCRIPT_NAME /myapp/index.php; - Apache:修改
public/.htaccess中的RewriteBase,改为RewriteBase /myapp/(注意结尾斜杠) - 关键验证点:访问
http://example.com/myapp/index.php?s=index/index能正常响应,说明入口通;再测/myapp/index/index能访问,说明重写生效
检查静态资源引用路径
模板中用 __STATIC__、__CSS__ 等内置常量生成的路径,默认基于网站根目录。子目录部署时需补上前缀。
立即学习“PHP免费学习笔记(深入)”;
- 在
config/app.php中添加:'view_replace_str' => ['__ROOT__' => '/myapp', '__STATIC__' => '/myapp/static'] - 或统一用助手函数:
<link rel="stylesheet" href="%7B:url('static/css/app.css')%7D">,它会自动拼接 base_url - 避免硬编码
/static/xxx.css,否则必然 404



















