规则写法有下面几种:Nginx
基础配置:监听 80 端口并返回 301
nginx
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/privkey.pem;
}多域名处理与标准 URL 规范化
nginx
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
若希望保留用户访问的原始域名,则使用 `$host` 变量;若需要强制统一到某个规范域名,则硬编码目标域名。
高级场景:保持完整 URI(含查询参数)
两种写法均能保留完整请求 URI,包括查询字符串[reference:0]:
nginx
写法一:return 301(推荐,性能更优)
return 301 https://$host$request_uri;
写法二:rewrite(需要正则匹配时使用)
rewrite ^(.*)$ https://$host$1 permanent;
return vs rewrite 对比:
对比维度 return rewrite
性能 更轻量级,直接返回重定向响应 需正则匹配,相对较重
适用场景 简单重定向(如 HTTP→HTTPS、域名跳转) 复杂 URL 重写与条件匹配
优先级 更高,执行后立即终止处理 继续匹配后续规则
推荐度 首选 仅在需要复杂正则时使用
`return` 指令执行完毕后会直接停止后续处理,对于全站 HTTP 强制跳转 HTTPS 或整站域名迁移场景,应首选 `return` 以获得更优性能[reference:1]。
Apache
方式一:VirtualHost 配置(推荐,性能最优)
编辑 Apache 主配置文件或虚拟主机配置文件(如 `/etc/apache2/sites-available/000-default.conf`):
apache
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/privkey.pem
</VirtualHost>
方式二:.htaccess 配置(适用于共享主机)
首先确保服务器已启用 `mod_rewrite` 且允许 `.htaccess` 覆盖(`AllowOverride All` 或 `AllowOverride FileInfo`)[reference:2]:
apache
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
方式三:mod_rewrite 高级规则
apache
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
IIS
前置条件:安装 URL Rewrite 模块
IIS 本身不内置 HTTPS 重定向功能,需先安装 Microsoft URL Rewrite Module 2.0(免费模块)。安装后,IIS 管理器中对应站点会出现 URL 重写图标[reference:3]。
配置方法一:IIS 管理器图形界面
1. 打开 IIS 管理器,在左侧连接树中选择目标网站站点
2. 双击 URL 重写 功能图标[reference:4]
3. 点击右侧 添加规则 → 选择 空白规则
4. 配置规则参数:
名称:`HTTP to HTTPS Redirect`
匹配 URL:
请求的 URL:与模式匹配
使用:正则表达式
模式:`(.*)`
条件:点击 添加,条件输入:`{HTTPS}`,模式:`^OFF$`
操作:
操作类型:重定向
重定向 URL:`https://{HTTP_HOST}/{R:1}`
重定向类型:301(永久)
5. 点击 应用 保存
配置方法二:web.config 手动编写
在网站根目录的 `web.config` 文件的 `<system.webServer>` 节点内添加以下规则[reference:5]:
xml
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS Redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
方法三:httpRedirect 简易配置
若仅需最简单的全站重定向且无需保留路径细节,可使用内置的 HTTP 重定向功能(需先在服务器管理器勾选安装)[reference:6]:
xml
<system.webServer>
<httpRedirect enabled="true" destination="https://example.com" exactDestination="false" />
</system.webServer>
> 注意:使用 URL 重写模块时,不要在SSL证书设置中勾选“需要 SSL”,否则会导致无限重定向循环[reference:7]。
通用注意事项
1. 重定向循环问题
原因:同时监听 80 和 443 端口,并在 443 端口中也配置了重定向规则,导致 HTTPS 请求再次被重定向到 HTTPS[reference:8]。
解决方案:确保重定向规则只配置在 80 端口的 server 块中,443 端口仅负责SSL证书处理,不包含任何重定向逻辑。
2. CDN 与反向代理场景
使用 CDN(如 Cloudflare、阿里云 CDN)时,源站接收到的请求协议可能并非用户实际协议,需通过代理头判断:
Nginx:
nginx
server {
listen 80;
server_name example.com;
# 方案一:信任代理头
set $redirect_https "0";
if ($http_x_forwarded_proto != "https") {
set $redirect_https "1";
}
if ($redirect_https = "1") {
return 301 https://$host$request_uri;
}
}
Apache:
apache
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
3. HSTS 推荐配置
在 443 端口的配置中添加 HSTS 响应头,告知浏览器后续请求强制使用 HTTPS:
Nginx:
nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Apache:
apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
> 添加 HSTS 前请确认网站已完全支持 HTTPS,否则可能导致无法访问。
4. 状态码选择
状态码 含义 适用场景
301 永久重定向 全站 HTTPS 化、域名迁移(推荐)
302 临时重定向 临时维护、A/B 测试
307 临时重定向(保留请求方法) 特殊场景需求
日常强制 HTTPS 场景推荐使用 301,有助于 SEO 权重传递[reference:9]。
5. 证书路径验证
配置前务必确认 SSL 证书路径正确且证书有效,否则 HTTPS 站点无法正常访问,重定向将毫无意义。检查命令:
bash
# Nginx 检查配置语法
nginx -t
# Apache 检查配置语法
apachectl -t