协助配置.htaccess:主域强制HTTPS子域强制HTTP并保留现有规则
完整的.htaccess配置方案
我来帮你把所有需求整合到一个配置里,重点要注意规则的执行顺序——跳转类规则必须放在最前面,避免后续的URL重写干扰跳转逻辑。以下是分步说明和完整配置:
1. 先处理子域名的特殊重定向
首先搞定bar.example.com的定向需求,因为这个子域名需要直接跳转到主域名的HTTPS页面,不用先走强制HTTP的逻辑:
# 重定向 bar.example.com 到 example.com/thing?foo=bar(强制HTTPS) RewriteCond %{HTTP_HOST} ^bar\.example\.com$ [NC] RewriteRule ^(.*)$ https://example.com/thing?foo=bar [R=301,L]
2. 主域名强制HTTPS,其他子域名强制HTTP
接下来处理全局的HTTP/HTTPS跳转逻辑:
- 主域名
example.com如果是HTTP访问,直接强制跳转到HTTPS - 除了
bar.example.com之外的所有子域名,因为没有通配符SSL证书,所以HTTPS访问时强制跳转到HTTP
# 主域名 example.com 强制HTTPS(支持带www前缀的话可以修改条件) RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] # 所有其他子域名强制HTTP RewriteCond %{HTTP_HOST} !^example\.com$ [NC] RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
3. 已有的URL美化规则(移除尾部斜杠+隐藏.php后缀)
这部分放在跳转规则之后,确保URL美化是在跳转完成后执行,避免出现跳转后URL格式不对的问题:
# 移除URL尾部斜杠(仅针对非目录的请求,避免影响真实目录访问) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [R=301,L] # 隐藏.php后缀,允许用 example.com/page 代替 example.com/page.php # 先确保请求的不是真实存在的文件/目录,再检查对应的.php文件是否存在 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L]
完整的.htaccess配置
把以上规则按顺序整合,加上注释方便后续维护:
# 开启Rewrite引擎 RewriteEngine On # 1. 处理bar子域名的特殊重定向 RewriteCond %{HTTP_HOST} ^bar\.example\.com$ [NC] RewriteRule ^(.*)$ https://example.com/thing?foo=bar [R=301,L] # 2. 主域名强制HTTPS RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] # 3. 其他子域名强制HTTP RewriteCond %{HTTP_HOST} !^example\.com$ [NC] RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L] # 4. 移除URL尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [R=301,L] # 5. 隐藏.php后缀 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L]
测试和注意事项
- 测试前一定要清空浏览器缓存,因为
R=301是永久重定向,浏览器会缓存跳转规则,可能导致测试结果不准确 - 确认你的服务器已经开启
mod_rewrite模块,否则所有Rewrite规则都不会生效 - 如果需要支持
www.example.com,可以把主域名强制HTTPS的条件改成RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC],这样带www的前缀也会被强制跳转到HTTPS
内容的提问来源于stack exchange,提问作者Ryan Nacker
相关产品推荐
相关产品推荐

