所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 虚拟服务器

使用 Nginx 在 VPS 上设置重定向:完整配置指南

重定向是任何管理良好的网络基础设施的基本组成部分。无论您是在重组网站、迁移到新域名,还是在维护期间临时路由流量,正确配置的重定向都能保护您的SEO排名、保留链接权益,并确保访问者始终登陆正确的页面。Nginx — 世界上最强大和应用最广泛的网络服务器之一 — 使实现重定向既灵活又高效。

本综合指南将引导您了解在VPS Hosting环境中使用Nginx配置HTTP重定向所需了解的一切内容,从理解重定向类型到在生产环境中测试和验证您的设置。

1. 理解 HTTP 重定向

在接触任何配置文件之前,了解重定向的实际作用以及为什么选择正确的类型很重要——尤其是对于 SEO。

HTTP 重定向是一个服务器响应,它指示客户端(通常是网络浏览器或爬虫)导航到与最初请求的 URL 不同的 URL。服务器使用 3xx HTTP 状态代码来传达这个指令,而你选择的具体代码对用户体验和搜索引擎行为都有重大影响。

最常见的重定向类型

重定向类型状态代码用例传递链接权益?
永久重定向301资源已永久移动✅ 是
临时重定向302资源暂时不可用❌ 否
临时重定向(方法安全)307临时移动,保留 HTTP 方法❌ 否
永久重定向(方法安全)308永久移动,保留 HTTP 方法✅ 是

301 永久重定向

301 重定向是最关键的 SEO 重定向类型。它向搜索引擎表示资源已永久移动到新 URL,将原始页面积累的链接权益(也称为”链接汁”)转移到目标页面。当永久重命名 URL、合并重复内容或迁移到新域时,请使用此方法。

302 临时重定向

302 重定向告诉浏览器和爬虫该移动是临时的,原始 URL 最终将被恢复。因为搜索引擎将其解释为暂时性的,他们不会将链接权益转移到目标 URL。将此用于 A/B 测试、临时维护页面或短期促销重定向。

307 临时重定向

307 重定向的行为类似于 302,但有一个关键区别:它明确保留原始 HTTP 请求方法。如果客户端向返回 307 的 URL 发送 POST 请求,客户端必须将 POST 重复到新 URL,而不是默认为 GET。这对于 API 端点和表单提交很重要。

308 永久重定向

308 重定向是 307 的永久对应物——它表示永久移动,同时也保留 HTTP 请求方法。它的使用频率不如 301,但在 API 密集的环境中很有价值。

2. 前提条件:通过 SSH 访问您的 VPS

要配置 Nginx 重定向,您需要对服务器的命令行访问权限。如果您运行的是基于 Linux 的 VPS Hosting 环境,这意味着通过 SSH 连接。

步骤 1:打开您的终端并连接

在 Linux 或 macOS 上,打开您的终端。在 Windows 上,使用 PuTTY 之类的客户端或具有 OpenSSH 支持的内置 Windows Terminal

ssh username@your_server_ip

username 替换为您的实际系统用户(例如,root 或启用了 sudo 的用户),并将 your_server_ip 替换为您的 VPS 的公共 IP 地址。

示例:

ssh admin@203.0.113.45

连接后,确认 Nginx 已安装并正在运行:

sudo systemctl status nginx

您应该看到输出指示服务 active (running)。如果尚未安装 Nginx,您可以使用以下命令安装它:

# On Ubuntu/Debian
sudo apt update && sudo apt install nginx -y

# On CentOS/RHEL/AlmaLinux
sudo dnf install nginx -y

3. 定位和理解 Nginx 配置文件

Nginx 使用分层配置结构。在进行任何更改之前,了解文件的位置至关重要。

默认配置路径

路径用途
/etc/nginx/nginx.conf主 Nginx 配置文件
/etc/nginx/sites-available/可用的虚拟主机配置
/etc/nginx/sites-enabled/符号链接的活动配置
/etc/nginx/conf.d/其他配置文件(CentOS/RHEL 风格)

Ubuntu/Debian 系统上,推荐的方法是在 /etc/nginx/sites-available/ 中创建单个配置文件,然后通过在 /etc/nginx/sites-enabled/ 中创建符号链接来启用它们。

CentOS/RHEL/AlmaLinux 系统上,配置通常位于 /etc/nginx/conf.d/

打开配置文件

要编辑特定域的配置:

sudo nano /etc/nginx/sites-available/example.com

如果文件尚不存在,此命令将创建它。您也可以使用 vim 或任何其他您喜欢的文本编辑器。

4. 在 Nginx 中配置重定向

Nginx 主要通过两个指令处理重定向:returnrewritereturn 指令更简单、更快速,建议用于大多数重定向场景。rewrite 指令提供了更强大的功能,用于复杂的基于模式的重定向。

方法 1:使用 return 指令(推荐)

return 指令停止处理并立即向客户端返回指定的 HTTP 状态代码和 URL。这是处理直接重定向的最有效方法。

设置 301 永久重定向(单个 URL)

server {
    listen 80;
    server_name example.com www.example.com;

    location /old-page {
        return 301 https://example.com/new-page;
    }
}

在此配置中,任何对 http://example.com/old-page 的请求都将被永久重定向到 https://example.com/new-page。搜索引擎将更新其索引以反映新 URL,并相应地转移链接权重。

设置 302 临时重定向

server {
    listen 80;
    server_name example.com;

    # Temporary redirect during maintenance
    location /promo-page {
        return 302 https://example.com/temporary-landing;
    }
}

此配置将访问者从 /promo-page 临时重定向到 /temporary-landing,不会影响原始 URL 的 SEO 信号。

重定向整个域名(非 WWW 到 WWW)

一个非常常见的用例是强制使用规范域名 — 例如,将所有 http://example.com 流量重定向到 https://www.example.com

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

server {
    listen 443 ssl;
    server_name www.example.com;

    # SSL configuration here
    # ...
}

$request_uri 变量保留原始路径和查询字符串,因此 http://example.com/blog/post-1?ref=newsletter 会正确重定向到 https://www.example.com/blog/post-1?ref=newsletter

将 HTTP 重定向到 HTTPS(SSL 强制)

强制使用 HTTPS 是安全最佳实践,也是 Google 排名信号。在服务器上安装 SSL 证书 后,按如下方式配置重定向:

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

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Your site configuration continues here
    root /var/www/example.com/html;
    index index.html index.php;
}

此配置捕获端口 80 上的所有 HTTP 流量,并发出 301 重定向到 HTTPS 等效版本,确保所有访问者和爬虫都使用您网站的安全版本。

将整个旧域名重定向到新域名

迁移网站到全新域名时,使用以下模式:

server {
    listen 80;
    listen 443 ssl;
    server_name old-domain.com www.old-domain.com;

    ssl_certificate /etc/letsencrypt/live/old-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/old-domain.com/privkey.pem;

    return 301 https://new-domain.com$request_uri;
}

这在域名迁移期间保留完整的 URL 路径,这对于维护您的 SEO 排名至关重要。如果您需要为项目注册新域名,AlexHost 提供价格实惠的 域名注册 服务。

方法 2:使用 rewrite 指令(基于模式的重定向)

rewrite 指令使用正则表达式来匹配和转换 URL。它比 return 更强大,但资源消耗也更多。当您需要用单个规则重定向多个 URL 模式时,可以使用它。

基本 rewrite 语法

rewrite regex replacement [flag];

标志:

    last — 停止处理当前 rewrite 指令并开始新的位置搜索
    break — 停止处理当前块中的重写指令
    redirect — 返回 302 临时重定向
    permanent — 返回 301 永久重定向
    
    使用模式重定向 URL
    假设您正在重组博客,需要将所有 URL 从 /blog/YYYY/MM/post-slug 重定向到 /articles/post-slug:
    server {
        listen 80;
        server_name example.com;
    
        rewrite ^/blog/[0-9]{4}/[0-9]{2}/(.*)$ /articles/$1 permanent;
    }
    此单个规则处理整个博客 URL 重组,捕获文章 slug 并将其插入新的 URL 模式中。
    重定向多个特定 URL
    对于少量特定的 URL 更改,在单独的 return 块中使用多个 location 指令更清晰且性能更好:
    server {
        listen 80;
        server_name example.com;
    
        location = /about-us {
            return 301 /about;
        }
    
        location = /services/web-design {
            return 301 /services/web-development;
        }
    
        location = /contact-form {
            return 301 /contact;
        }
    }
    = 修饰符在 location 中执行精确匹配,这是 Nginx 中最快的匹配类型。
    方法 3:基于查询字符串的重定向
    Nginx 在 location 块中本身不支持查询字符串匹配,但您可以使用 $arg_ 变量或 if 指令进行基于查询字符串的重定向:
    server {
        listen 80;
        server_name example.com;
    
        location /page {
            if ($arg_id = "123") {
                return 301 /new-page-123;
            }
            if ($arg_id = "456") {
                return 301 /new-page-456;
            }
        }
    }
    > 注意:虽然 if 指令适用于简单情况,但在复杂配置中可能会导致意外行为。Nginx 社区通常将此称为”if is evil”问题。请谨慎使用并充分测试。
    5. 高级重定向场景
    将子目录重定向到另一个域
    server {
        listen 80;
        server_name example.com;
    
        location /shop/ {
            return 301 https://shop.example.com$request_uri;
        }
    }
    删除尾部斜杠
    不一致的尾部斜杠可能会导致重复内容问题。要通过删除尾部斜杠来规范化 URL:
    server {
        listen 80;
        server_name example.com;
    
        rewrite ^/(.*)/$ /$1 permanent;
    }
    向目录 URL 添加尾部斜杠
    相反,如果您的 CMS 或应用程序需要尾部斜杠:
    server {
        listen 80;
        server_name example.com;
    
        location ~ ^(/[^.]*[^/])$ {
            return 301 $1/;
        }
    }
    使用 GeoIP 进行基于地理位置的重定向
    对于为多个地区提供服务的网站,您可以使用 ngx_http_geoip_module 根据用户的地理位置重定向用户:
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    
    server {
        listen 80;
        server_name example.com;
    
        if ($geoip_country_code = "DE") {
            return 302 https://de.example.com$request_uri;
        }
    
        if ($geoip_country_code = "FR") {
            return 302 https://fr.example.com$request_uri;
        }
    }
    6. 测试您的 Nginx 配置
    在应用更改到生产服务器之前,请务必先进行测试。 Nginx 配置中的语法错误可能会导致您的整个网站离线。
    第 1 步:验证配置语法
    sudo nginx -t
    有效配置的预期输出:
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    如果您看到错误,Nginx 将报告检测到问题的特定文件和行号,使调试变得简单明了。
    第 2 步:重新加载 Nginx 以应用更改
    配置测试通过后,优雅地重新加载 Nginx(不会中断活动连接):
    sudo systemctl reload nginx
    或者,进行完整重启(这会短暂中断活动连接):
    sudo systemctl restart nginx
    对于大多数重定向更改,reload 就足够了,也是首选方式。
    7. 验证您的重定向正常工作
    应用配置后,在认为任务完成之前,请验证重定向的行为完全符合预期。
    方法 1:浏览器测试
    打开浏览器并导航到旧 URL。观察您是否正确重定向到新目标。如需更多详情,打开开发者工具(F12),导航到网络选项卡,然后重新加载页面。您将看到完整的重定向链,包括每一步返回的状态代码。
    方法 2:从命令行使用 curl
    curl 命令是测试重定向的最可靠方式,不会受到浏览器缓存的干扰:
    curl -I http://example.com/old-page
    -I 标志仅获取 HTTP 响应头。查找响应中的 Location 头和状态代码:
    HTTP/1.1 301 Moved Permanently
    Server: nginx/1.24.0
    Date: Mon, 01 Jan 2024 12:00:00 GMT
    Content-Type: text/html
    Location: https://example.com/new-page
    Connection: keep-alive
    要自动跟踪整个重定向链:
    curl -IL http://example.com/old-page
    -L 标志指示 curl 跟踪重定向,结合 -I,它会显示链中每一步的头信息。
    方法 3:在线重定向检查工具
    多个免费在线工具可以可视化您的重定向链并识别问题,如重定向循环或过多的重定向跳转:
    
    Redirect Checker(redirect-checker.org)
    httpstatus.io
    Screaming Frog SEO Spider(桌面应用程序,免费版本支持最多 500 个 URL)
    
    检查重定向循环
    重定向循环发生在 URL A 重定向到 URL B,而 URL B 又重定向回 URL A 的情况下(或通过最终循环回的更长链)。这会导致浏览器显示错误,如 *”ERR_TOO_MANY_REDIRECTS”*。
    使用 curl 检测循环:
    curl -IL --max-redirs 10 http://example.com/old-page
    如果 curl 达到最大重定向限制,则存在循环。仔细检查您的配置,确保不存在循环重定向路径。
    8. 常见重定向错误及避免方法
    错误 1: 使用 302 而不是 301
    这是重定向中最常见的 SEO 错误。如果 URL 更改是永久性的,始终使用 301。意外使用 302 意味着搜索引擎不会转移链接权益,并将继续索引旧 URL。
    错误 2: 重定向链
    避免不必要地链接重定向(例如,A → B → C → D)。每个额外的跳转都会增加延迟并削弱通过链传递的 SEO 价值。定期审计您的重定向并将其更新为直接指向最终目标。
    错误 3: 未保留查询字符串
    重定向整个域或目录时,始终在重定向目标中包含 $request_uri 或 $query_string,以避免删除重要的 URL 参数。
    错误:
    return 301 https://new-domain.com;
    正确:
    return 301 https://new-domain.com$request_uri;
    错误 4: 忘记处理 HTTP 和 HTTPS
    如果您的网站同时提供 HTTP 和 HTTPS,请确保您的重定向规则考虑两种协议,否则可能会导致行为不一致。
    错误 5: 更改后未进行测试
    在重新加载之前始终运行 sudo nginx -t,并在应用更改后始终使用 curl 验证重定向。几秒钟的测试可以防止数小时的故障排除。
    9. Nginx 重定向 vs. .htaccess 重定向
    如果您正在从基于 Apache 的托管环境迁移到 VPS 上的 Nginx,您可能习惯于通过 .htaccess 文件管理重定向。重要的是要了解 Nginx 不支持 .htaccess 文件。所有重定向逻辑必须直接放在 Nginx 服务器块配置文件中。
    这实际上是一个优势:Nginx 不需要在每次请求时读取 .htaccess 文件,这有助于在许多场景中相比 Apache 具有更优越的性能。
    如果您更喜欢为 VPS 提供托管控制面板体验,AlexHost 提供带有 cPanel 的 VPS 和一系列VPS 控制面板,提供图形界面来管理重定向和其他服务器配置,无需直接编辑配置文件。
    10. Nginx 重定向的 SEO 最佳实践
    正确配置的重定向是技术 SEO 的关键组成部分。以下是要遵循的关键原则:
    对永久更改使用 301 重定向
    任何时候永久更改 URL — 无论是重命名页面、重组网站架构还是迁移域名 — 都要使用 301 重定向。这确保 Google 和其他搜索引擎更新其索引,并将旧 URL 的排名权重转移到新 URL。
    最小化重定向跳转
    Google 的爬虫会跟踪重定向链,但每个跳转都会消耗爬虫预算并略微削弱 PageRank。保持重定向链尽可能短 — 理想情况下从旧 URL 到最终目标只需一个跳转。
    更新内部链接
    重定向是一个安全网,而不是清洁内部链接的替代品。实施重定向后,更新内部链接以直接指向新 URL。这可以减少服务器负载,并确保爬虫将预算用于内容而不是跟踪重定向。
    提交更新的网站地图
    在进行重大 URL 更改后,更新 XML 网站地图以反映新 URL,并通过 Google Search Console 重新提交。这会加快重新索引过程。
    使用 Google Search Console 监控
    实施重定向后,监控 Google Search Console 中的爬虫错误、覆盖问题以及展示次数或点击次数的任何意外下降。重定向问题通常在实施后的几天内出现。
    结论
    掌握 Nginx 重定向配置是任何系统管理员或在 VPS 上运行网站的所有者必备的技能。无论您是强制使用 HTTPS、合并重复 URL、迁移到新域名还是重组网站架构,Nginx 都提供了高效可靠地处理每种场景的工具。
    本指南的关键要点:
    
    选择正确的重定向类型:301 用于永久移动(对 SEO 至关重要),302/307 用于临时移动
    使用 return 指令进行简单重定向 — 它比 rewrite 更快更简洁
    使用 rewrite 指令进行复杂的、基于模式的 URL 转换
    始终测试使用 sudo nginx -t,然后重新加载,并在之后使用 curl -IL 验证
    保留查询字符串在重定向整个域或目录时使用 $request_uri
  • 避免重定向链,通过直接指向最终目的地来重定向
  • 如果您正在寻找一个可靠的、高性能的环境来运行您的 Nginx 服务器,请探索 AlexHost 的 VPS 主机计划 — 为速度、安全性和完全 root 访问而构建,让您可以完全控制服务器配置。