ThinkPHP5不能同时使用域名绑定和二级目录部署,二者冲突必须二选一:https://example.com/myapp/是二级目录,需关闭url_domain_deploy并配置app_url、base_url及服务器RewriteBase或alias;https://m.example.com/才是二级域名,需开启url_domain_deploy并在route.php中用Route::domain注册规则。

ThinkPHP5 不能同时用「域名绑定」和「二级目录部署」——二者冲突,必须二选一。如果你的访问地址是 https://example.com/myapp/(带路径前缀),那就不是二级域名,而是二级目录;如果你要的是 m.example.com 或 admin.example.com,那才是二级域名。先分清这个,再往下调。
确认你到底要的是二级目录还是二级域名
这是最容易混淆的第一步。很多用户以为“把项目放在 /myapp/ 下就是二级域名”,其实不是:
• https://example.com/myapp/ → 二级目录(URL 路径含 /myapp/)
• https://m.example.com/ → 二级域名(Host 是 m.example.com)
ThinkPHP5 的 url_domain_deploy 只读取 $_SERVER['HTTP_HOST'],对路径前缀完全无感。所以如果你在 Apache/Nginx 里把项目配在 /myapp/ 下,但又开了 url_domain_deploy,框架根本收不到 m.example.com 这个 Host,自然不会触发域名路由。
如果是二级目录(/myapp/),别开 url_domain_deploy
开启 url_domain_deploy 不仅无效,还会干扰 URL 生成逻辑,导致 url() 函数漏掉 /myapp/ 前缀。你应该:
• 关闭 config/app.php 中的 'url_domain_deploy' => false
• 在 config/app.php 中显式设置:
'app_url' => 'https://example.com/myapp'
'base_url' => '/myapp/'
• Apache 用户:确保 public/.htaccess 有 RewriteBase /myapp/(结尾斜杠不能少)
• Nginx 用户:用 alias 指向 /path/to/myapp/public/,且 try_files 中的 /myapp/public/index.php 必须带完整 URI 前缀
• 所有静态资源引用改用 __ROOT__/static/css/app.css 或绝对路径 /myapp/static/css/app.css
如果是二级域名(m.example.com),Web 服务器必须透传 HTTP_HOST
本地开发常失败,就是因为 hosts + 浏览器发请求时 Host 头没被正确送达 PHP。关键检查点:
• hosts 文件加两行:
127.0.0.1 example.com
127.0.0.1 m.example.com
• Apache 虚拟主机配置中,ServerName 和 ServerAlias 要包含 m.example.com,且不能遗漏 UseCanonicalName Off
• Nginx location 块里禁止重写或覆盖 Host 头,确保 fastcgi_param HTTP_HOST $host; 存在
• ThinkPHP5 中启用:
'url_domain_deploy' => true
并在 route.php 里写:
\think\Route::domain('m', 'mobile');
• 不要依赖 __domain__ 配置数组——它只在早期 TP5 版本有效,5.1+ 推荐动态注册
立即学习“PHP免费学习笔记(深入)”;
二级目录 + 二级域名混合场景?得靠 Web 服务器拆解
极少数需求如 https://m.example.com/myapp/,既带子域又带路径,TP5 原生不支持这种嵌套识别。你必须在 Web 层提前做判断:
• Apache:用 RewriteCond %{HTTP_HOST} ^m\.example\.com$ + RewriteRule ^/myapp/(.*)$ /myapp/public/index.php?s=$1 [L]
• Nginx:用 map 提取子域名,再结合 location /myapp/ 分流到对应入口
• PHP 层无法自动感知这种组合,APP_BASE_PATH 和 HTTP_HOST 需人工协同设置,稍有不慎就 404 或路由错乱



















