Nginx 环境下实现 HTTP 和 HTTPS(SSL)共存的完整指南

在 Nginx 中配置 SSL 证书后,通常需要实现 HTTP 和 HTTPS 的共存或重定向。本文将详细介绍如何配置 Nginx,以支持 HTTP 和 HTTPS 的共存,以及如何将 HTTP 请求重定向到 HTTPS。


1. 配置 HTTPS 访问

首先,确保已经为 Nginx 配置了 SSL 证书。以下是一个基本的 HTTPS 配置示例:

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

    # 其他 HTTPS 配置
    root /var/www/html;
    index index.html index.htm;
}

关键点:

  • listen 443 ssl;:监听 443 端口并启用 SSL。
  • ssl_certificatessl_certificate_key:指定 SSL 证书和私钥的路径。

2. 实现 HTTP 到 HTTPS 的重定向

如果希望将所有 HTTP 请求重定向到 HTTPS,可以通过以下配置实现:

server {
    listen 80;
    server_name 10.11.4.12;

    # 将 HTTP 请求重定向到 HTTPS
    return 301 https://$host$request_uri;
}

关键点:

  • listen 80;:监听 80 端口(HTTP)。
  • return 301 https://$host$request_uri;:使用 301 重定向将所有 HTTP 请求跳转到 HTTPS。

3. 实现 HTTP 和 HTTPS 共存

在某些场景下,可能需要同时支持 HTTP 和 HTTPS 访问。以下是实现 HTTP 和 HTTPS 共存的配置方法:

3.1 错误配置示例

以下配置会导致 HTTP 访问报错 400 Bad Request

server {
    listen 443 ssl;
    listen 80;
    server_name localhost;

    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

    root /var/www/html;
    index index.html index.htm;
}

错误原因:

  • ssl on; 指令会导致 Nginx 将所有流量(包括 HTTP)视为 HTTPS,从而引发错误。

3.2 正确配置示例

要实现 HTTP 和 HTTPS 共存,需要删除 ssl on; 指令,并在 listen 443 后添加 ssl 参数:

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

    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

    root /var/www/html;
    index index.html index.htm;
}

关键点:

  • listen 80;:监听 HTTP 请求。
  • listen 443 ssl;:监听 HTTPS 请求并启用 SSL。
  • 删除 ssl on; 指令,避免将 HTTP 流量错误地视为 HTTPS。

4. 高级配置:根据协议动态调整行为

在某些场景下,可能需要根据访问协议(HTTP 或 HTTPS)动态调整行为。例如,强制某些路径仅通过 HTTPS 访问:

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

    location /secure {
        return 301 https://$host$request_uri;
    }

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

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

    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

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

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

关键点:

  • /secure 路径仅允许通过 HTTPS 访问。
  • 其他路径支持 HTTP 和 HTTPS 共存。

5. 总结

通过合理的 Nginx 配置,可以实现 HTTP 和 HTTPS 的共存或重定向。以下是两种常见场景的配置建议:

  1. HTTP 重定向到 HTTPS

    • 使用 return 301 https://$host$request_uri; 将所有 HTTP 请求重定向到 HTTPS。
    • 适用于需要强制 HTTPS 访问的场景。
  2. HTTP 和 HTTPS 共存

    • 删除 ssl on; 指令,并在 listen 443 后添加 ssl 参数。
    • 适用于需要同时支持 HTTP 和 HTTPS 访问的场景。

注意事项:

  • 确保 SSL 证书和私钥路径正确。
  • 测试配置后重启 Nginx 服务:
    sudo nginx -t  # 测试配置文件
    sudo systemctl restart nginx  # 重启 Nginx
    

通过以上配置,您可以灵活地管理 HTTP 和 HTTPS 的访问方式,满足不同的业务需求。