php 8.1中实现301永久重定向的核心是:1、调用http_response_code(301)设置状态码;2、用header('location: 绝对url')发送重定向头;3、立即执行exit终止脚本;4、确保代码位于任何输出之前。

PHP 8.1 中实现 301 永久重定向,核心是正确发送 Location 响应头并设置 HTTP 状态码为 301,同时立即终止脚本执行。下面提供几种常见且可靠的写法,适用于不同场景。
基础重定向(推荐初学者使用)
这是最简洁、安全的写法,适用于单页面或简单路由跳转:
- 必须在任何输出(包括空格、BOM、
echo、print)之前调用header() - 务必加
exit;或die();防止后续代码执行 - 使用
http_response_code(301)显式声明状态码,增强语义清晰度
<?php // 确保此处没有任何输出(包括前面的空行或 UTF-8 BOM)
http_response_code(301);
header('Location: https://example.com/new-page');
exit;
?>
带条件判断的重定向(如旧URL迁移)
当需要根据请求路径、参数或域名动态跳转时,可结合 $_SERVER 变量做判断:
- 用
$_SERVER['REQUEST_URI']获取当前路径(不含域名) - 用
$_SERVER['HTTP_HOST']判断访问域名,避免跨域误判 - 建议对目标 URL 使用
filter_var(..., FILTER_SANITIZE_URL)做基础过滤(非必需但更稳妥)
<?php $oldPath = $_SERVER['REQUEST_URI'];
$host = $_SERVER['HTTP_HOST'];
if ($host === 'www.old-site.com' && $oldPath === '/old-article.php') {
$newUrl = 'https://www.new-site.com/article';
http_response_code(301);
header("Location: $newUrl");
exit;
}
?>
批量规则重定向(模拟简易 .htaccess 行为)
适合从 Apache 迁移到 Nginx + PHP 环境,或需在 PHP 层统一处理多条重定向规则:
- 将旧路径与新 URL 映射存入关联数组,便于维护
- 使用
str_starts_with()(PHP 8.0+)或strpos() === 0做前缀匹配 - 匹配成功后立即跳转,不继续遍历
<?php $redirectMap = [
'/old-contact' => 'https://example.com/contact-us',
'/blog/' => 'https://example.com/articles/',
'/index.html' => 'https://example.com/',
];
$requestUri = $_SERVER['REQUEST_URI'] ?? '';
foreach ($redirectMap as $from => $to) {
if (str_starts_with($requestUri, $from)) {
http_response_code(301);
header("Location: $to" . substr($requestUri, strlen($from)));
exit;
}
}
// 若未匹配,继续正常执行(如加载首页)
?>
注意事项与避坑指南
以下几点直接影响重定向是否被搜索引擎正确识别和用户是否感知异常:
-
绝对 URL 必须包含协议(
https://或http://):相对路径或仅路径会导致 302 或解析失败 -
避免重复发送 header:检查是否有其他文件(如 config.php、header.php)提前输出内容;可用
headers_sent($file, $line)调试 -
不要在重定向后写 HTML 或 echo 内容:即使加了
exit,也建议把重定向逻辑放在最前面 - HTTPS 环境下注意混合内容:若原站强制 HTTPS,重定向目标也应为 HTTPS,否则可能被浏览器拦截
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











