You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

协助配置.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:16:36