配置.htaccess 301重定向html转php时出现异常http//路径无法访问
问题根因
你遇到的无冒号http//异常前缀,来自两个配置层面的冲突和漏洞:
- 现有配置混写了
mod_rewrite的重写规则和mod_alias的RedirectPermanent指令,两个模块的执行顺序不统一,拼接绝对重定向URL时容易出现协议头格式错误,部分Apache环境下mod_alias会因为自身协议配置缺失,直接拼出缺少冒号的http//前缀返回给浏览器,且不会做语法合法性校验。 - 301重定向会被浏览器强缓存,哪怕后续修正了配置,旧的错误跳转结果也可能持续触发;如果之前写页面跳转规则时不小心漏了协议头的冒号,Apache会原样把错误字符串作为跳转目标返回。
修正后的完整.htaccess配置
删掉所有RedirectPermanent指令,统一用mod_rewrite实现所有重定向逻辑,避免跨模块冲突,完整配置如下:
RewriteEngine On # www域名跳转至非www域名,写全带冒号的http协议头 RewriteCond %{HTTP_HOST} ^www\.example\.de$ [NC] RewriteRule ^(.*)$ http://example.de/$1 [R=301,L] # tour.html 跳转至 tour.php RewriteRule ^tour\.html$ /tour.php [R=301,L] # 需求中的abc.html 跳转至 abc.php RewriteRule ^abc\.html$ /abc.php [R=301,L]
验证排错步骤
- 清理浏览器本地针对该域名的缓存,301的强缓存会导致你改对配置后依然访问到旧的错误跳转
- 不要直接用浏览器测跳转结果,用命令行工具发起无缓存请求校验,比如执行
curl -I http://www.example.de/tour.html,查看返回头里的Location字段,确认是正确的http://example.de/tour.php,不存在缺冒号的错误前缀 - 所有跳转规则不要依赖
mod_alias的Redirect/RedirectPermanent指令,只要开启了mod_rewrite,所有跳转逻辑统一用rewrite规则实现,可规避90%以上的URL拼接错误
内容的提问来源于stack exchange,提问作者user15194958
相关产品推荐
相关产品推荐

