在Nginx中强制使用HTTPS访问有多种方法,以下是常见的几种实现方式及其配置示例:
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;
}
rewrite
指令server {
listen 80;
server_name example.com;
rewrite ^(.*)$ https://$server_name$1 permanent; # permanent表示301
}
if
条件判断(灵活但需谨慎)server {
listen 80;
server_name example.com;
if ($scheme != "https") {
return 301 https://$server_name$request_uri;
}
}
注意:Nginx官方建议尽量避免使用
if
,但在简单场景下可用。
在HTTPS的server块中添加响应头,强制浏览器后续直接使用HTTPS:
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 其他SSL配置...
}
作用:浏览器在首次访问后会缓存HTTPS策略,后续自动跳转。
确保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优化配置...
}
直接关闭HTTP的server
块(仅保留443端口):
# 不配置任何80端口的server块,或直接关闭80监听
curl -I http://example.com
检查返回状态码是否为301
/302
。server
块配置正确且证书有效。# 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组合。