You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Nginx中为Rails应用配置HTTP自动跳转HTTPS

实现HTTP到HTTPS的自动跳转(Nginx配置优化)

看了你的Nginx配置,其实你已经离目标很近了,只需要调整几个细节就能让HTTP自动跳转HTTPS的功能完美生效。下面是优化后的完整配置,以及关键部分的说明:

优化后的完整配置

upstream puma_tn{ 
    # Path to Puma SOCK file, as defined previously 
    server unix:/home/deploy/tn/shared/tmp/sockets/tn-puma.sock fail_timeout=0; 
} 

server {
    listen 80;
    server_name www.tn.com.au;
    # 直接返回301永久重定向到HTTPS,用$host比$server_name更灵活,兼容域名变更场景
    return 301 https://$host$request_uri;
} 

server {
    listen 443 ssl default_server;
    server_name www.tn.com.au;
    root /home/deploy/tn/current/public;
    try_files $uri/index.html $uri @app;

    ssl_certificate /etc/ssl/certs/tn.crt;
    ssl_certificate_key /etc/ssl/private/tn.key;
    # 注意:nginx 1.15.0+版本不建议用ssl on; 直接在listen指令后加ssl是更标准的写法
    # ssl on; 

    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_protocols TLSv1.2 TLSv1.3; # 仅保留安全的TLS版本,废弃存在漏洞的旧版本
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    # Security Changes-Start
    server_tokens off;
    more_set_headers 'Server: Eff_You_Script_Kiddies!';
    # Security Changes-End

    location @app {
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_http_version 1.1;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        add_header X-Frame-Options "SAMEORIGIN";
        proxy_set_header Connection '';
        proxy_pass http://puma_tn;
    }

    location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    underscores_in_headers on;
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    send_timeout 600;
}

关键调整说明

  • HTTP重定向块:保留listen 80的server块,只保留return 301 https://$host$request_uri;即可,删掉冗余的注释和代码。用$host替代$server_name更灵活,它会优先读取请求头中的Host值,能兼容你后续可能添加的别名域名。
  • HTTPS块SSL配置:移除了过时的ssl on;指令(nginx 1.15.0之后推荐在listen中直接声明ssl),同时更新ssl_protocols仅保留TLSv1.2和TLSv1.3——这两个是当前符合安全标准的协议版本,旧的TLSv1、TLSv1.1存在已知安全漏洞,建议禁用。
  • HSTS头强化:你已经添加的Strict-Transport-Security头可以让浏览器强制使用HTTPS访问站点,加上always参数能确保这个头在所有响应(包括错误页面)中都被发送,进一步提升安全性。

修改完成后,先执行nginx -t检查配置语法是否正确,确认无误后执行systemctl reload nginx(或service nginx reload)让新配置生效即可。

内容的提问来源于stack exchange,提问作者Chakreshwar Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:37:42