nginx强制http跳转https的核心是监听80端口的server块中使用return 301 https://$host$request_uri,保留原始路径与参数;需另配443端口ssl server块,配置后须nginx -t验证并reload生效。

在 Nginx 中,通过 server 块实现强制 HTTPS 重定向,核心是监听 HTTP(端口 80)并返回 301 重定向到对应的 HTTPS 地址。
基础写法:单独的 HTTP server 块做 301 跳转
最常用、最清晰的方式是定义一个仅监听 80 端口的 server 块,内部用 return 301 指令跳转:
server {
listen 80;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;">return 301 https://$server_name$request_uri;}
-
$server_name 自动匹配当前请求的
Host头(需确保server_name已正确定义) - $request_uri 保留原始路径和查询参数,保证跳转后 URL 完整
- 使用
301是永久重定向,利于 SEO;如需临时跳转可用302
配合主 HTTPS server 使用
实际部署中,这个 HTTP server 块通常与另一个监听 443 的 HTTPS server 块共存:
# HTTP → HTTPS 重定向
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
<h1>主 HTTPS 服务</h1><p>server {
listen 443 ssl http2;
server_name example.com www.example.com;</p><pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 其他配置...
location / {
proxy_pass http://backend;
}}
注意事项
- 确保
server_name与域名完全一致(支持通配符或多个域名,但不能留空) - 若使用 CDN 或反向代理(如 Cloudflare),注意真实客户端 IP 和协议头,可能需要搭配
map或if ($scheme = http)在 HTTPS server 内部处理(不推荐,优先用独立 HTTP server) - 避免在 HTTPS server 块里用
if ($scheme = http) { return 301 ... }—— Nginx 官方不建议在server级别用if做重定向,易出错且性能略差 - 配置修改后务必执行
nginx -t测试语法,再nginx -s reload生效
支持多域名的简洁写法
当有多个域名需统一跳转时,可利用变量简化:
server {
listen 80;
server_name ~^(?<domain>.+)$;
<pre class="brush:php;toolbar:false;">return 301 https://$domain$request_uri;
}
该写法通过正则捕获 Host 头,适用于泛域名场景(需确认 Nginx 版本 ≥ 1.9.1 支持命名捕获)











