规则写法有下面几种: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