如何修复CPANEL AutoSSL下htaccess RewriteRule的RewriteCond反向引用问题?
解决cPanel AutoSSL导致的.htaccess RewriteCond反向引用失效问题
当你在cPanel上搭配AutoSSL(基于Let’s Encrypt)使用时,系统会自动往.htaccess文件里添加一堆和.well-known文件夹相关的RewriteCond规则,而且还会定期更新这个文件——你根本没法删掉这些规则。但头疼的是,这些自动生成的规则会直接搞坏你原本写的重写逻辑,就像你贴的那个www转非www的例子,完全没法正常工作。
为啥会这样?因为RewriteRule里的%1是引用最后一条RewriteCond的捕获组,而不是你第一条用来匹配主机名的那个。你看你写的规则里,后面几条AutoSSL自动添加的Cond都没有捕获组,所以%1根本拿不到正确的非www主机名,跳转自然就失效了。
给你个靠谱的解决方案:把第一条Cond捕获到的主机名存到环境变量里,后面直接用环境变量来跳转,就不会受后续Cond的影响了。修改后的规则如下:
# www 转 non-www (适配cPanel AutoSSL自动添加的规则) RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC,E=NON_WWW_HOST:%1] # 下面这些是cPanel自动添加的规则,无需改动 RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule ^(.*)$ http://%{ENV:NON_WWW_HOST}/$1 [R=301,L]
这个方法的核心是用E=NON_WWW_HOST:%1把第一条Cond捕获到的非www主机名存到环境变量NON_WWW_HOST里,后续RewriteRule直接引用%{ENV:NON_WWW_HOST}——不管后面加多少条AutoSSL的规则,这个变量的值都不会变,完美避开了反向引用的坑。
内容的提问来源于stack exchange,提问作者Rafael F.
相关产品推荐
相关产品推荐

