在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
相关产品推荐
相关产品推荐

