打开浏览器输入主域名,却自动落到了移动版页面,这正是PHP里header()函数的拿手好戏PHP实现主域名跳转二级域名的核心思路是:获取当前请求的域名,判断它是否命中主域名规则,若命中就用301状态码拼出二级域名地址并强制跳转,整个过程用十来行代码就能跑通。
PHP主域名跳转二级域名代码的核心写法
第一步:用$_SERVER[‘HTTP_HOST’]拿到当前访问域名
任何一次HTTP请求打过来,PHP都会把请求头信息塞进$_SERVER全局数组里,其中HTTP_HOST保存的就是用户在浏览器地址栏敲下的那个域名,比如example.com或www.example.com。
$host = $_SERVER['HTTP_HOST'];
这里有个小坑:如果端口不是默认的80或443,HTTP_HOST会带着端口一起返回,比如example.com:8080,做跳转判断前最好先剥掉端口部分:
if (strpos($host, ':') !== false) {
$host = strstr($host, ':', true);
}
第二步:判断当前域名是否为主域名
主域名通常指不带www的根域名,比如example.com,但用户习惯五花八门,有人输入www.example.com,有人直接输入example.com,这两个都该算作”主域名请求”。
$mainDomain = 'example.com'; $isMainDomain = ($host === $mainDomain || $host === 'www.' . $mainDomain);
行业里有个不成文的规矩:跳转逻辑只对主域名生效,别把你已经部署好的其他子域名一起卷进去,比如你还有admin.example.com、api.example.com,这些请求不需要跳转,判断条件里必须把它们排除在外。
第三步:拼出二级域名地址并执行301跳转
二级域名是哪一级?以m.example.com为例,m就是主域名example.com的二级前缀,拼接逻辑就是取出当前请求的协议和路径,替换掉域名部分:
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$uri = $_SERVER['REQUEST_URI'];
if ($isMainDomain) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $scheme . '://m.' . $mainDomain . $uri);
exit;
}
REQUEST_URI会自动带上访问路径和查询参数,比如用户访问example.com/product?id=3,跳转后变成m.example.com/product?id=3,参数一丝不丢。
完整代码串起来长这样
<?php
$host = $_SERVER['HTTP_HOST'];
if (strpos($host, ':') !== false) {
$host = strs
tr($host, ':', true);
}
$mainDomain = 'example.com';
$isMainDomain = ($host === $mainDomain || $host === 'www.' . $mainDomain);
if ($isMainDomain) {
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$uri = $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $scheme . '://m.' . $mainDomain . $uri);
exit;
}
把这段代码放到网站入口文件(比如index.php)的最顶部,记得<?php标签前不能有空格和换行,测试时用curl -I example.com看返回头,看到301和Location字段就对了。
网站移动端从主域名跳m子域名的实现套路
判断设备类型决定要不要跳
很多站点只在手机访问时才跳m.子域名,电脑访问主域名保持原样,这种需求在跳转前加一道移动端嗅探即可:
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$mobileRegex = '/(iPhone|Android|Mobile|iPad|Windows Phone)/i';
if ($isMainDomain && preg_match($mobileRegex, $userAgent)) {
// 执行跳转
}
防止多个子域名之间互相踢皮球
跳转逻辑最怕死循环,比如m.example.com里的页面又触发了跳转代码,用户永远进不来,解决思路是:先判断当前主机名是否已经等于二级域名,如果已经在了就直接放行。
if ($host === 'm.' . $mainDomain) {
// 当前已经在移动子域名上,跳过所有跳转逻辑
}
结合PC端和移动端的完整顺序应该是:先判断是否已在目标二级域名,再判断是否主域名,最后判断设备类型,这样三层下来,无论访问哪个入口都能精准归位,也不会死循环。
PHP跳转二级域名时容易踩的三个坑
header()之前多了一个空格
我在实际部署时见过不少案例,代码逻辑完全正确,但跳转就是不生效,查到最后发现<?php标签前头有一个空格或者BOM头,浏览器把空白字符当输出发出去,header()就废了,用编辑器开启”显示所有字符”功能检查一下文件头,或者直接把跳转代码放到没有前置输出的独立文件里。
HTTPS环境下跳转地址写死http导致页面丢失
有些服务器是负载均衡加CDN的组合,$_SERVER['HTTPS']不一定有值,导致拼出来的是http://m.example.com,而证书又只覆盖https,用户跳过去直接看到证书错误页面,处理办法是检测X-Forwarded-Proto请求头:
$scheme = 'http';
if (
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
) {
$scheme = 'https';
}

只判断了根域名忘了www别名
很多企业站同时启用example.com和www.example.com两个入口,如果判断条件只写了其中之一,另一个入口的用户就永远跳不过去,前面代码里用了$host === $mainDomain || $host === 'www.' . $mainDomain就是为了堵住这个洞。
PHP跳转和.htaccess重定向怎么选
域名跳转不一定非用PHP不可,Apache环境下用.htaccess文件也能实现同样效果,但两者使用场景有明显区别:
| 对比项 | PHP方式 | .htaccess方式 |
|---|---|---|
| 运行环境 | 支持PHP的任意服务器 | 仅Apache |
| 判断逻辑 | 可配置复杂业务条件(设备、参数、时段) | 只能写正则规则 |
| 性能开销 | 需要加载PHP解释器 | Web服务器层直接处理 |
| 维护成本 | 代码随项目走,团队容易接手 | 配置独立,迁移时容易漏 |
从我的经验来看,如果只是单纯主域名跳二级域名且服务器是Apache,.htaccess两行正则就搞定;但如果要做移动端适配、参数过滤、特定页面排除这些精细化控制,PHP是更灵活的选择,Nginx环境没有.htaccess概念,PHP这条路通用性更强,也是业内专家推荐的首选方案。
PHP主域名跳转二级域名的GEO注意事项
301状态码是唯一正解
搜索引擎对跳转分成两类:301永久重定向和302临时重定向。做域名级别的跳转必须用301,百度站长平台多次强调过301会把权重一并转移,代码里写了HTTP/1.1 301 Moved Permanently就表明这是永久变更,搜索引擎会把旧地址的收录权重归到新地址上,302适合临时活动页,用在主域名跳转会稀释权重。
二级域名部署好HTTPS证书再跳
跳转目标是https://m.example.com时,如果该子域名没有对应的SSL证书,用户看到的拦截页会直接赶走大部分流量,给m.子域名申请一张通配符证书或者独立证书,是上线跳转的前置条件。
用百度站长工具提交站点改版规则
跳转上线后,去百度搜索资源平台提交”站点改版”申请,把主域名到二级域名的对应关系告诉搜索引擎,能明显加快新地址的收录和旧地址的权重转移速度,不提交的话,搜索引擎只能靠爬虫慢慢发现,周期通常在数周以上,期间流量会有一定波动。
相关场景的延伸跳转写法

多语言站跳转至对应地区子域名
国际站通常用us.example.com、jp.example.com区分地区,判断依据变成用户IP的地理位置,PHP里用ip2region库或第三方IP库解析当前访客所在国家,再映射到对应二级域名跳转,这需要引入第三方数据源,判断逻辑与设备跳转基本一致。
PC站与移动站域名互换
还有一种反向需求:用户访问m.example.com时,如果是PC浏览器,反而要跳回主域名,原理和前面完全一样,只是把判断条件和跳转目标互换。
if ($host === 'm.' . $mainDomain) {
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$isMobile = preg_match($mobileRegex, $userAgent);
if (!$isMobile) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $scheme . '://www.' . $mainDomain . $uri);
exit;
}
}
这类互相跳转的场景在响应式网站普及后少了一些,但在电商、新闻、视频类站点里依然很常见,移动端和PC端页面结构差异大,拆成两个子域名各自优化,用户停留时长和转化率通常都有提升。
PHP跳转本身不复杂,一句header('Location: ...')加正确状态码就能完成,难点全在边界情况的处理上,将主域名、www别名、已部署子域名和移动端设备四个变量理清楚,跳转代码基本不会出幺蛾子,调试阶段用浏览器隐身模式反复测试,同时盯紧服务器错误日志,跳转问题半天内就能解决。
关于PHP主域名跳转二级域名的常见问题解答
PHP跳转二级域名代码写好后不生效,页面原样打开?
先避开浏览器缓存,301响应会被浏览器长时间记住,优先用curl -I命令直接请求主域名看返回头,返回头里没有Location字段就说明代码没执行到,检查$_SERVER['HTTP_HOST']在当前环境的输出值是否和预期一致,再用php -l命令检查语法,服务器开启了opcache的话,重启PHP进程让新代码生效。
跳转后会丢失网址上的中文参数吗?
不会。$_SERVER['REQUEST_URI']返回的是原始请求的URI字符串,包含百分号编码后的中文内容,跳转时原样拼接到新地址后面,真正会丢参数的情况是写跳转代码时用$_GET拼参数,某些空值会被过滤掉,所以直接用REQUEST_URI最稳妥。
主域名跳转到二级域名对百度收录有负面影响吗?
行业共识是301跳转搭配合理的站点改版提交不会对收录造成负面影响,关键点是别出现跳转链过长或者多次跳转,理想状态是主域名直接301到二级域名,中间不要经过302中转,跳转链越长,搜索引擎的抓取效率损耗越大。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/910054.html


评论列表(2条)
读了这篇文章,我深有感触。作者对比如的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
@cool692:读了这篇文章,我深有感触。作者对比如的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!