1. 简介

在本文中,我们将介绍如何在 Nginx 中正确配置 HTTP 到 HTTPS 的跳转。通过 HTTPS 加密网站通信,不仅可以保护用户数据,还能提升搜索引擎排名。

我们还会讨论在反向代理场景下,如何处理 HTTPS 到 HTTP 的跳转问题。

2. 为什么要将 HTTP 跳转到 HTTPS?

将 HTTP 跳转到 HTTPS 可以确保客户端与服务器之间的通信通过 传输层安全协议(TLS) 加密,从而提升数据传输的安全性。这种加密机制可以防止登录凭证、个人资料、支付信息等敏感数据被中间人窃取。

此外,HTTPS 还能防止中间人篡改通信内容,确保客户端接收到的数据与服务器发送的数据完全一致,保障数据完整性。

Google 等搜索引擎也优先索引 HTTPS 页面,这意味着使用 HTTPS 的网站更容易获得更高的搜索排名。✅

这种偏好鼓励我们尽快采用 HTTPS,以提升网站安全性和搜索可见性。同时,用户更愿意信任带有“安全锁”标识的网站,这也有助于提升用户体验和转化率。

2.1. 架构流程图

我们主要介绍两种场景:HTTP 到 HTTPS 的跳转,以及反向代理中 HTTPS 到 HTTP 的处理。以下是基本架构流程图。

HTTP 到 HTTPS 的跳转流程图:

          +-------------+
          |   客户端     |
          +-------------+
                |
                v
     +---------------------+
     |     Nginx 服务器     |
     | (监听端口 80)        |
     +---------------------+
                |
                v
     +-----------------------------+
     | 跳转到 HTTPS (端口 443)      |
     +-----------------------------+
                |
                v
     +---------------------+
     |     Nginx 服务器     |
     | (监听端口 443)       |
     +---------------------+
                |
                v
     +-----------------------------+
     | 安全地提供 HTTPS 内容         |
     +-----------------------------+

在这个流程中:

  • 客户端发起 HTTP 请求
  • Nginx 在 80 端口监听并接收请求
  • Nginx 将请求 301 跳转到 HTTPS(443 端口)
  • 客户端重新发起 HTTPS 请求
  • Nginx 安全响应 HTTPS 请求

HTTPS 到 HTTP 的反向代理流程图:

          +-------------+
          |   客户端     |
          +-------------+
                |
                v
     +---------------------+
     |     Nginx 服务器     |
     | (监听端口 443)       |
     +---------------------+
                |
                v
     +-----------------------------+
     | 转发请求到后端服务器(HTTP 80)|
     +-----------------------------+
                |
                v
     +---------------------------+
     | 后端应用服务器(监听 80)  |
     +---------------------------+
                |
                v
     +-----------------------------+
     | 提供 HTTP 内容(内部通信)    |
     +-----------------------------+

在这个流程中:

  • 客户端发起 HTTPS 请求
  • Nginx 监听 443 端口并接收请求
  • Nginx 将请求转发到后端 HTTP 服务器(通常为 80 端口)
  • 后端服务器处理请求并返回 HTTP 内容

有了这些基本概念后,我们接下来看看具体的配置代码。

3. 基础 HTTP 到 HTTPS 跳转配置

将 HTTP 请求跳转到 HTTPS 是保障网站安全的基础操作。本节将介绍如何配置 Nginx 实现该跳转,并附带完整的 SSL 配置示例。

3.1. Nginx 配置示例

最基础的跳转配置如下:

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

    return 301 https://$host$request_uri;
}

说明:

  • listen 80:监听 HTTP 请求
  • server_name:指定要响应的域名
  • return 301 https://$host$request_uri:301 永久跳转到 HTTPS 地址

✅ 这种配置适用于静态网站或简单服务。

3.2. 完整的 HTTPS 配置(含 SSL)

更完整的配置示例如下:

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

    return 301 https://$host$request_uri;
}

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

    ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /var/www/yourdomain.com;
        index index.html index.htm;
    }
}

说明:

  • 第一个 server 块处理 HTTP 请求并跳转
  • 第二个 server 块监听 443 端口,处理 HTTPS 请求
  • ssl_certificatessl_certificate_key 指定证书路径
  • ssl_protocolsssl_ciphers 配置加密协议和加密套件

⚠️ 证书路径请根据实际部署环境调整。

4. 反向代理中处理 HTTPS 到 HTTP 的跳转

当 Nginx 作为反向代理时,有时需要处理后端返回的 HTTP 跳转地址,将其转换为 HTTPS。

4.1. 基础反向代理配置

基础 HTTPS 到 HTTP 的反向代理配置如下:

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

说明:

  • proxy_pass:将请求转发到后端 HTTP 服务
  • proxy_set_header:设置必要的请求头,如 Host、IP、转发协议等

4.2. 处理后端返回的 HTTP 跳转

如果后端服务返回的是 HTTP 的 302/301 跳转地址,我们需要将其重写为 HTTPS:

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        proxy_redirect http:// https://;
    }
}

关键点:

  • proxy_redirect http:// https://;:将后端返回的 HTTP 跳转地址重写为 HTTPS

⚠️ 如果不加 proxy_redirect,可能会导致客户端跳转到 HTTP 地址,出现混合内容警告。

5. 小结

本文介绍了如何在 Nginx 中正确配置 HTTP 到 HTTPS 的跳转,并涵盖了 SSL 证书的配置方法。同时,我们也讨论了反向代理场景下如何处理 HTTPS 到 HTTP 的跳转问题。

通过这些配置,我们可以实现:

  • 安全的通信通道
  • 更好的搜索引擎优化(SEO)
  • 更高的用户信任度和转化率

✅ 推荐所有生产环境的 Web 服务都启用 HTTPS,并配置跳转规则,以保障网站安全性和可用性。


原始标题:How to Properly Redirect HTTP to HTTPS Domains in Nginx?