<IfModule mod_rewrite.c>
RewriteEngine On
# ----------------------------------------------------------------------
# 例外规则:如果请求的是Let's Encrypt的验证文件,则不执行下面的跳转规则
# ----------------------------------------------------------------------
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/ [NC]
# ----------------------------------------------------------------------
# 跳转规则:当访问的域名是 sxy.midou99.com 或者 a.midou99.com 时
# ----------------------------------------------------------------------
RewriteCond %{HTTP_HOST} ^a\.a\.com$ [OR]
RewriteCond %{HTTP_HOST} ^a\.b\.com$ [NC]
# 规则:将所有请求永久重定向到新域名,并保留原始路径和参数
RewriteRule ^(.*)$ https://c.cn/$1 [R=301,L]
</IfModule>
关键改动解释
我们在跳转规则之前,增加了一行关键代码:
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/ [NC]
RewriteCond
: 定义一个条件。%{REQUEST_URI}
: 代表用户请求的URL路径部分(例如/page.html
或/.well-known/acme-challenge/some-file
)。!
: 一个否定符号,意思是 “不匹配”。^/\.well-known/acme-challenge/
: 匹配以/.well-known/acme-challenge/
开头的路径。我们用\
来转义.
,确保它匹配的是一个真正的点。[NC]
: 表示不区分大小写。
这整行代码的含义是:“仅当请求的URL路径不是Let's Encrypt验证路径时,才继续往下执行后面的跳转规则。”
新的工作流程
部署这个新的 .htaccess
文件后:
- 当Let's Encrypt服务器来验证时:
- 它访问
http://旧域名/.well-known/acme-challenge/文件名
。 .htaccess
的第一条RewriteCond
检测到路径匹配验证目录,因为!
(否定) 的存在,条件不成立。- 因此,后续的跳转规则被跳过。
- 服务器正常返回验证文件的内容。
- 证书申请/续期成功!
- 它访问
- 当普通用户访问时:
- 用户访问
http://旧域名/任何其他页面.html
。 .htaccess
的第一条RewriteCond
条件成立 (因为路径不是验证路径)。- 服务器继续执行后面的域名判断和跳转规则。
- 用户被成功重定向到
https://c.cn
!
- 用户访问
这样就完美地解决了您的需求,既保证了全站的无缝跳转,又不会影响SSL证书的自动续期。
评论