二级域名绑定指定目录的正确做法,是先让DNS把域名解析到服务器IP,再在Web服务器中为这个域名单独配置根目录,最后用PHP代码做一次域名路由兜底。很多人一开始只在PHP里判断域名,结果请求根本没到达指定目录,根源就在于Web服务器的虚拟主机配置没做对。
网站二级域名如何绑定指定目录:先分清两个层面
二级域名和子目录是两个不同层面的东西,DNS只负责把 demo.example.com 解析到服务器IP,至于这个域名进来后读取哪个文件夹,是Web服务器说了算,业内专家指出,不先搞定Web服务器层面的映射,PHP写再多判断逻辑也接不到请求。
用Nginx配置二级域名到子目录的具体步骤
以最常见的Nginx + PHP-FPM组合为例,操作路径很清晰。
- 先在DNS控制台添加一条A记录,把
demo.example.com解析到服务器IP,等待生效。 - 编辑Nginx配置,通常放在
/etc/nginx/conf.d/下,新建一个demo.conf。 - 写入一个独立的server块,核心就是
server_name和root两个指令。 - 执行
nginx -t检查语法,systemctl reload nginx重载配置。
示例配置如下:
server {
listen 80;
server_name demo.example.com;
root /var/www/demo;
index index.php index.html;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
这段配置的关键在于 root 指向了 /var/www/demo,这样 demo.example.com 的所有请求都会被引导到该目录,PHP文件则通过fastcgi参数交给PHP-FPM处理。
Apache环境下二级域名绑定目录的两种写法
如果你用的是Apache,思路完全一样,区别在写法。
- 在虚拟主机配置文件里加一个
<VirtualHost :80>段落,设置ServerName和DocumentRoot。 - 在httpd.conf中开启
mod_rewrite,通过.htaccess做域名判断,这种方式配置灵活,但每次请求都要解析额外规则,性能略低,不推荐在高并发场景下使用。
宝塔面板二级域名绑定目录的PHP环境配置实操

很多朋友使用宝塔面板,因为可视化操作确实省事,宝塔面板二级域名绑定目录的路径是:网站 → 添加站点 → 填写域名 → 修改根目录。
具体步骤如下:
- 登录宝塔面板,进入“网站”菜单。
- 点击“添加站点”,在域名输入框填入
demo.example.com。 - 根目录不要用默认生成的路径,手动改成目标目录,
/var/www/demo。 - PHP版本根据项目需求选择,通常用PHP 7.4或8.1稳定版。
- 提交后,如果跑的是ThinkPHP、Laravel这类框架,在站点设置里的“伪静态”中直接选择对应模板。
这一步做好后,二级域名的请求就会落在指定目录里,整个过程不需要手动改Nginx配置,面板帮你生成好了。
绑定后访问404或500的排查顺序
绑定完目录,访问却报错,这是高频问题,排查顺序建议从外向里。
- 先确认根目录下存在
index.php,并且文件名没有拼错。 - 再检查目录权限,确保运行PHP的用户,
www,至少拥有读和执行权限。 - 然后看Nginx错误日志,位置通常在
/var/log/nginx/error.log。 - 最后确认PHP-FPM进程启动正常,而且监听端口和Nginx配置里的
fastcgi_pass一致。
多数情况的报错原因是权限不足,而不是配置有问题。
二级域名的Cookie和Session不能共享怎么办
主域名和二级域名是不同的域,浏览器会默认隔离Cookie,如果你在 example.com 登录后,跳到 demo.example.com 又变成未登录状态,就需要主动设置Cookie的作用域。
行业共识认为,跨子域共享登录态时,把Cookie域设置为 .example.com 是标准做法,在PHP里可以这样设置:
session_set_cookie_params([
'domain' => '.example.com',
'path' => '/',
'secure' => true,
'httponly' => true,
]);
也可以在 php.ini 中修改 session.cookie_domain 为 .example.com,需要提醒的是,修改后旧Cookie可能失效,用户需要重新登录一次。
Nginx下PHP二级域名绑定的常见坑与伪静态规则
用Nginx绑定二级域名时,最常见的坑是有人把判断逻辑写在

location / 里,用PHP代码去include不同目录,这样做的后果是静态资源、图片、CSS全部会走PHP解析,性能非常差,正确做法是先把 root 指到目标目录,让Nginx自己处理静态文件,PHP只负责动态请求。
伪静态规则要跟着站点走
二级域名绑定的目录如果跑的是Laravel或ThinkPHP,伪静态规则需要单独配置,不要把主域名的规则直接复制过来,因为框架的入口文件和目录结构可能不同。
通用规则如下:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
这条规则会让所有非真实文件请求落到 index.php,由框架内部路由处理,如果你的二级域名使用WordPress,则需要在 location / 里加上WordPress的固定链接规则。
SSL证书和二级域名的绑定顺序
先确认DNS解析生效,再签发证书,否则验证会失败,二级域名可以用Let's Encrypt免费证书,也可以申请通配符证书,一个证书覆盖主域名和所有子域名,国内服务器部署时,二级域名同样需要完成ICP备案,据工信部规定,域名只要解析到国内服务器就必须备案,不区分主域还是子域。
二级域名绑定不同目录后,PHP代码里如何做最终兜底
即使Nginx或Apache已经配置好了,也建议在PHP代码里加一层兜底判断,这样可以防止将来迁移服务器时,因为Web服务器配置漏改而出现错乱。
用 $_SERVER['HTTP_HOST'] 获取当前域名,再映射到对应的配置:
$host = $_SERVER['HTTP_HOST'];
switch ($host) {
case 'demo.example.com':
define('APP_ROOT', '/var/www/demo/');
break;
case 'admin.example.com':
define('APP_ROOT', '/var/www/admin/');
break;
default:
define('APP_ROOT', '/var/www/main/');
break;
}
注意,这里只能用 APP_ROOT 作为常量,绝对不要直接用 $host 去拼接文件路径,否则容易引发目录穿越安全风险。
纯代码实现二级域名指向目录的路由逻辑
如果你使用的是共享虚拟主机,没有权限修改Web服务器配置,就只能靠纯PHP实现,在网站根目录放一个 index.php,作为前端控制器。
- 读取
$_SERVER['SERVER_NAME']
获取当前域名。
- 维护一份域名到目录的映射表。
- 根据请求的路径,包含对应目录下的入口文件。
- 剩余请求统一交给404处理。
这种方案比较经济,适合部署在低配置主机上,但与Nginx虚拟主机方案相比,每个请求都要执行额外的PHP逻辑,并发高时CPU占用会明显上升。
多站点部署时,二级域名目录权限的常规分配
一台服务器跑多个项目时,不要让所有二级域名共用同一个PHP-FPM池。
- 每个站点单独创建一个系统用户,并在PHP-FPM配置里指定
user和group。 - 用
open_basedir限制PHP只能读取自己目录下的文件。 - 数据库账号权限最小化,生产环境不要用root。
- 定期检查访问日志,观察是否有跨目录请求。
只有把目录权限边界划清楚,多个二级域名才能在一台服务器上稳定共存。
关于PHP二级域名绑定指定目录的3个高频问题
问题1:二级域名绑定指定目录后,主域名的伪静态规则会影响二级域名吗?
如果二级域名有独立的Nginx server块,则完全不影响,因为每个server配置各自独立,如果使用通配符server块加PHP代码分发,那么伪静态规则可能互相干扰,建议优先采用独立server块。
问题2:一台服务器可以绑定多少个二级域名到不同目录?
理论上没有硬性限制,Nginx可以创建任意数量的server块,但每个PHP-FPM进程都会占用一定内存,动态站点多了之后资源消耗会明显上升,小内存机器跑几十个纯静态站点通常没问题,跑动态PHP站点则需要根据内存大小和流量合理规划。
问题3:二级域名绑定目录后PHP报“No such file or directory”怎么办?
先检查配置中的 root 路径是否存在,再检查PHP-FPM运行用户是否有权限访问该目录,最后排查 open_basedir 和SELinux是否阻止了访问,绝大多数情况是目录权限设置不对,调整用户权限后即可解决。
二级域名绑定指定目录,本质上是Web服务器的虚拟主机配置问题,把Nginx或Apache的 root 指到正确位置,再用PHP代码做一层兜底判断,多站点部署就能干净利落地跑起来。