首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現 301 永久重定向:SEO 權重平滑遷移指南

     編輯:PHP 相關知識

什麼是 301 重定向

HTTP 狀態碼 **301 Moved Permanently** 告訴瀏覽器和搜索引擎:**資源永久移動到新 URL**。瀏覽器會自動跳轉,搜索引擎會將舊頁權重(PageRank、收錄、關鍵詞排名)轉移到新頁,**是域名遷移、網站改版、URL 規範化的必備手段**。

PHP 實現標準代碼

<?php
// redirect_301.php - 放在舊頁入口或公共引導文件最頂部

// 1. 確定目標域名/路徑
$newHost = 'https://www.newdomain.com'; // 新域名
$requestUri = $_SERVER['REQUEST_URI'] ?? '/'; // 保留原路徑與查詢串

// 2. 判斷是否需要重定向(避免循環)
$currentHost = $_SERVER['HTTP_HOST'] ?? '';
if ($currentHost !== 'www.newdomain.com') { // 舊域名或裸域
    // 3. 發送 301 頭
    header('HTTP/1.1 301 Moved Permanently', true, 301);
    // 4. Location 頭必須是絕對 URL
    header('Location: ' . $newHost . $requestUri);
    exit;
}

// 正常業務邏輯...
?>

常見場景模板

場景一:舊域名 → 新域名(全站遷移)

<?php
$oldDomains = ['old.com', 'www.old.com', 'legacy.site'];
$newDomain  = 'https://www.newsite.com';

if (in_array($_SERVER['HTTP_HOST'] ?? '', $oldDomains)) {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $newDomain . $_SERVER['REQUEST_URI']);
    exit;
}

場景二:裸域 → www(規範化)

<?php
if (strpos($_SERVER['HTTP_HOST'] ?? '', 'www.') !== 0) {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: https://www.' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    exit;
}

場景三:HTTP → HTTPS(全站 SSL)

<?php
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    exit;
}

場景四:舊 URL 結構 → 新結構(如 /article.php?id=123 → /article/123)

<?php
$map = [
    '/article.php' => '/article/',
    '/product.php' => '/product/',
    '/category.php' => '/category/',
];

$uri = $_SERVER['REQUEST_URI'];
$parsed = parse_url($uri);
$path = $parsed['path'] ?? '';
$query = $parsed['query'] ?? '';

if (isset($map[$path]) && preg_match('/id=(\d+)/', $query, $m)) {
    $newUrl = 'https://' . $_SERVER['HTTP_HOST'] . $map[$path] . $m[1];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $newUrl);
    exit;
}

Nginx/Apache 層面實現(性能更高)

**生產環境強烈建議在 Web 服務器層面做 301**,避免啟動 PHP 進程,延遲更低、併發更強。

Nginx

server {
    listen 80;
    server_name old.com www.old.com;
    return 301 https://www.newsite.com$request_uri;
}

# 裸域跳 www
server {
    listen 80 443 ssl;
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

Apache (.htaccess)

RewriteEngine On
# 舊域名跳新域名
RewriteCond %{HTTP_HOST} ^(old\.com|www\.old\.com)$ [NC]
RewriteRule ^(.*)$ https://www.newsite.com/$1 [R=301,L]

# 裸域跳 www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

# HTTP 跳 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

驗證與監控

  1. `curl -I https://old.com/page` → 檢查 `HTTP/1.1 301` 及 `Location`。
  2. Google Search Console → 「變更地址」工具提交遷移。
  3. 提交新站點地圖,監控收錄轉移進度。
  4. 檢查 Analytics 流量是否平穩過渡。

避坑指南

錯誤後果正確做法
用 302/307 臨時重定向權重不傳遞,SEO 受損必須 301
重定向鏈過長(A→B→C)爬蟲中斷、用戶延遲單步直達最終 URL
所有舊頁跳首頁軟 404、權重流失一對一映射到相關新頁
Location 用相對路徑部分瀏覽器/爬蟲解析失敗絕對 URL(含 scheme+host)
未更新內部鏈接/站點地圖產生大量 301 內部跳轉全站掃描替換內部鏈接

總結

PHP 實現 301 只需 `header('HTTP/1.1 301 Moved Permanently')` + `header('Location: 絕對URL')` + `exit`。但**生產環境首選 Nginx/Apache 層面**,性能更優、配置更清晰。遷移核心在於**一對一映射、避免重定向鏈、及時通知搜索引擎**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved