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_certificate
和ssl_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 的共存或重定向。以下是两种常见场景的配置建议:
-
HTTP 重定向到 HTTPS:
- 使用
return 301 https://$host$request_uri;
将所有 HTTP 请求重定向到 HTTPS。 - 适用于需要强制 HTTPS 访问的场景。
- 使用
-
HTTP 和 HTTPS 共存:
- 删除
ssl on;
指令,并在listen 443
后添加ssl
参数。 - 适用于需要同时支持 HTTP 和 HTTPS 访问的场景。
- 删除
注意事项:
- 确保 SSL 证书和私钥路径正确。
- 测试配置后重启 Nginx 服务:
sudo nginx -t # 测试配置文件 sudo systemctl restart nginx # 重启 Nginx
通过以上配置,您可以灵活地管理 HTTP 和 HTTPS 的访问方式,满足不同的业务需求。