插件窝 干货文章 nginx强制使用https访问的方法有哪些

nginx强制使用https访问的方法有哪些

server HTTPS example 定向 750    来源:    2025-04-24

在Nginx中强制使用HTTPS访问有多种方法,以下是常见的几种实现方式及其配置示例:


方法1:301/302重定向(推荐)

server {
    listen 80;
    server_name example.com www.example.com;
    # 301永久重定向到HTTPS
    return 301 https://$server_name$request_uri;

    # 或者使用302临时重定向(测试阶段用)
    # return 302 https://$server_name$request_uri;
}

方法2:使用rewrite指令

server {
    listen 80;
    server_name example.com;
    rewrite ^(.*)$ https://$server_name$1 permanent;  # permanent表示301
}

方法3:通过if条件判断(灵活但需谨慎)

server {
    listen 80;
    server_name example.com;
    if ($scheme != "https") {
        return 301 https://$server_name$request_uri;
    }
}

注意:Nginx官方建议尽量避免使用if,但在简单场景下可用。


方法4:HSTS(HTTP Strict Transport Security)

在HTTPS的server块中添加响应头,强制浏览器后续直接使用HTTPS:

server {
    listen 443 ssl;
    server_name example.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    # 其他SSL配置...
}

作用:浏览器在首次访问后会缓存HTTPS策略,后续自动跳转。


方法5:结合SSL证书配置

确保HTTPS的server块正确配置SSL证书:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    # 其他SSL优化配置...
}

方法6:禁用HTTP访问(仅监听HTTPS)

直接关闭HTTP的server块(仅保留443端口):

# 不配置任何80端口的server块,或直接关闭80监听

注意事项

  1. 测试重定向:使用curl -I http://example.com检查返回状态码是否为301/302
  2. 避免重定向循环:确保HTTPS的server块配置正确且证书有效。
  3. 性能优化:301缓存优于302,适合生产环境。
  4. HSTS预加载:提交域名到HSTS Preload List实现全局强制HTTPS。

完整配置示例

# HTTP → HTTPS重定向
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS主配置
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # 启用HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

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

选择适合你场景的方案即可。推荐优先使用301重定向 + HSTS组合。