.htaccess重写规则实现Heroku站点域名掩码不生效排查求助
问题解答
1. 同一条规则在两个站点表现不一致的原因
- 核心差异来自两个域名的重定向配置逻辑不同:使用URL重定向解析记录的站点,本质是注册商侧先做了一层反向代理,请求先到注册商代理节点,再转发到Heroku,你的.htaccess规则有机会被触发;而Godaddy的域名转发功能默认是301/302显性跳转,会直接返回Heroku的目标地址给浏览器,地址栏在请求到达Heroku之前就已经被修改,你的.htaccess规则根本不会被执行。
- 另一个可能的影响因素是两个Heroku应用的Apache模块配置存在差异,比如另一个站点开启了
mod_proxy模块而当前站点未开启,会导致[P]标志对应的代理规则无法生效。
2. 当前重写规则存在的错误
你的规则存在明显的逻辑错误,本身就无法触发:
HTTP_HOST变量仅存储请求的域名部分,不包含任何路径后缀,你写的RewriteCond %{HTTP_HOST} ^mysd.herokuapp.com/public永远不可能匹配成功,规则全程不会生效。- 修正后的基础规则参考(需要提前开启
mod_proxy和mod_proxy_http模块):
RewriteEngine On RewriteCond %{HTTP_HOST} ^mysd\.herokuapp\.com$ RewriteRule ^public/(.*)$ https://mydomain.co/$1 [P,L]
- 更推荐的替代方案是直接在Heroku后台绑定自定义域名
mydomain.co和www.mydomain.co,配合DNS做CNAME解析到Heroku的应用地址,完全不需要写重写规则就能实现地址栏保留原域名的需求。
3. DNS设置与注册商配置的影响
该问题和DNS、注册商重定向配置直接相关:
- 若你使用注册商的显性URL重定向:注册商直接返回3xx跳转响应,浏览器地址栏直接变更为目标地址,请求不会到达Heroku,你的重写规则完全不生效。
- 若你使用注册商的隐性URL转发:注册商侧会做反向代理,请求先到注册商节点再转发到Heroku,你的重写规则才有机会执行。
- 不同注册商的重定向实现逻辑差异很大,部分注册商的转发服务本身不支持传递Header或者代理逻辑存在限制,也会导致重写规则失效。
内容的提问来源于stack exchange,提问作者LilMoke
相关产品推荐
相关产品推荐

