PHP项目域名重定向如何用代码实现?从入门到实战的完整指南
📚 目录导读
域名重定向的核心概念与场景
Q:什么是域名重定向?为什么PHP项目中需要它?
域名重定向(URL Redirection)指将用户访问的某个域名或路径自动跳转到另一个目标地址,在PHP项目中,它通常用于以下场景:

- 主域名统一:将
example.net、example.org等别名全部301跳转到www.example.com - HTTPS强制跳转:将所有HTTP请求重定向到HTTPS安全版本
- 旧站迁移:网站改版后,将旧URL(如
/old-page.php)永久跳转到新地址(如/new-page/) - 多语言/区域分流:根据用户IP或语言参数重定向到不同子域名
重要提示:不同重定向类型(301永久、302临时)对SEO影响截然不同,务必根据需求选择。
PHP实现重定向的四种基础方法
最常用的 header() 函数
<?php
// 301永久重定向(推荐用于域名变更)
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://www.example.com/new-page/");
exit; // 必须调用exit终止后续代码执行
?>
注意事项:
- 必须在任何HTML输出前调用此函数(包括空格和BOM头)
- 使用绝对URL(包含协议和域名)避免歧义
header_remove() 配合清除输出缓冲
<?php
ob_start(); // 开启输出缓冲
// 即使前面有警告输出,也能安全跳转
header("Location: https://www.example.com/");
ob_end_flush();
exit;
?>
http_response_code() 显式设置状态码
<?php
http_response_code(301);
header("Location: https://www.example.com/");
exit;
?>
Meta刷新方式(不推荐)
<meta http-equiv="refresh" content="0; url=https://www.example.com/">
缺点:对SEO不友好,且可能被浏览器拦截。
实战:多域名统一重定向到主域名
场景描述:你的PHP项目支持 example.com、www.example.com、example.net 三个域名,但主域名是 www.example.com,需将所有访问统一跳转。
完整代码实现(建议放在所有PHP文件入口 index.php 或 bootstrap.php 最顶部)
<?php
// 获取当前请求的完整域名(不含路径)
$current_domain = $_SERVER['HTTP_HOST'] ?? '';
// 定义主域名
$main_domain = 'www.example.com';
// 需要重定向的域名列表(包括主域名的非www版本)
$redirect_domains = [
'example.com',
'example.net',
'www.example.net',
];
// 检查是否需要重定向
if (in_array($current_domain, $redirect_domains, true)) {
// 301永久重定向
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://{$main_domain}{$_SERVER['REQUEST_URI']}");
exit;
}
// 如果是主域名,不做任何操作继续执行后续代码
// 可选:强制HTTPS
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://{$main_domain}{$_SERVER['REQUEST_URI']}");
exit;
}
?>
代码解析:
$_SERVER['HTTP_HOST']获取当前请求的域名$_SERVER['REQUEST_URI']保留当前请求的路径和参数(如/api?page=1)- 使用
in_array()匹配需要跳转的域名列表 - 强制HTTPS跳转保证了安全传输
高级技巧:基于路径和参数的条件重定向
1 旧URL模式转换为新URL
<?php
// 访问 /old-product.php?id=123 -> 跳转到 /products/123
if (strpos($_SERVER['REQUEST_URI'], '/old-product.php') !== false) {
$id = $_GET['id'] ?? 0;
$new_url = "/products/{$id}/";
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://www.example.com{$new_url}");
exit;
}
?>
2 浏览器语言检测重定向
<?php
// 根据浏览器首选语言重定向到对应子域名
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'en', 0, 2);
$lang_map = ['zh' => 'cn', 'ja' => 'jp', 'ko' => 'kr'];
$sub = $lang_map[$lang] ?? 'en';
$host = $_SERVER['HTTP_HOST'];
if (!str_starts_with($host, $sub . '.')) {
$new_host = "{$sub}.example.com";
header("Location: https://{$new_host}{$_SERVER['REQUEST_URI']}");
exit;
}
?>
常见错误与调试指南
| 错误现象 | 原因 | 解决方案 |
|---|---|---|
| “Cannot modify header information” 警告 | 后调用header() | 检查文件开头是否有空格/HTML;使用输出缓冲 ob_start() |
| 重定向循环 | 条件判断逻辑错误 | 在重定向目标中添加排除条件(如:检查当前域名是否为目标域名) |
| 只跳转首页不跳转子页面 | 忘记拼接 $_SERVER['REQUEST_URI'] |
使用完整URL:header("Location: https://{$main}{$_SERVER['REQUEST_URI']}") |
| 跳转后POST数据丢失 | 301/302重定向会丢弃原请求体 | 自定义重定向页面保留表单数据,或改用307临时重定向 |
调试小技巧:使用 var_dump($_SERVER); 打印服务器变量,检查 HTTP_HOST 和 REQUEST_URI 的值是否符合预期。
FAQ:开发者最常问的5个问题
Q1:PHP重定向和.htaccess重定向哪个更好?
A:PHP重定向适合动态条件(如登录状态判断、用户权限检查),而.htaccess更适合静态规则(如域名跳转、强制HTTPS),推荐配合使用:.htaccess处理基础域名跳转,PHP处理业务逻辑重定向。
Q2:如何测试重定向是否生效?
A:使用 curl -I https://example.com 查看状态码(301/302)和Location头;浏览器按F12打开Network标签,检查网络响应的Status值。
Q3:301和302对SEO的影响是什么?
A:301永久重定向会传递90%以上的权重给新页面,适合网站改版;302临时重定向不传递流量权重,适合A/B测试或临时维护页。
Q4:如何实现只重定向特定目录(如 /blog/)?
A:在PHP代码中使用 strpos($_SERVER['REQUEST_URI'], '/blog/') === 0 判断路径开头,然后执行跳转。
Q5:重定向后URL中文参数乱码怎么办?
A:使用 urlencode() 编码参数值,或直接传递原始参数(PHP会自动处理URL编码),示例:
$search = urlencode('中文关键词');
header("Location: /search?q={$search}");
本文从基础概念到实战场景,详细介绍了PHP项目中使用代码实现域名重定向的完整方法,核心要点包括:
- 始终在页面最顶部调用header(),并紧接exit
- 区分301和302,根据SEO需求选择状态码
- 保留原URL路径:用
$_SERVER['REQUEST_URI']拼接完整地址 - 调试神器:
curl -I命令检查响应头
掌握这些技巧后,你可以灵活应对大部分域名重定向需求,如果你有更复杂的场景(如根据用户Cookie跳转),欢迎在评论区留言讨论。