Apache Linux 2 Elastic Beanstalk 如何将http与www重定向到https非www
Apache 多场景URL重定向正确配置方案
配置错误原因
你之前的逻辑存在两个问题:
- 运算符写反:
%{HTTP_HOST} !~ /^www\./表示主机名不是www开头时满足条件,等于不带www的正常请求也会被重定向规则匹配 - 重定向目标未做域名修剪:直接使用
%{HTTP_HOST}作为目标域名,匹配到非预期条件时就会出现www.www.example.com这类循环拼接的异常
不推荐将HTTP跳转、域名修剪多个逻辑合并到单条If条件中,逻辑运算符一旦写反很容易出现匹配异常,拆分独立规则的维护成本和出错概率都更低。
推荐配置方案
拆分多规则实现,每个规则只负责一类跳转逻辑,可读性和可维护性都更高,完整配置如下:
RewriteEngine On # 规则1:所有HTTP请求统一跳转到HTTPS(保留原域名,适配反向代理X-Forwarded-Proto场景) <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'"> RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </If> # 规则2:所有带www前缀的HTTPS请求跳转到不带www的地址 <If "%{HTTP_HOST} =~ /^www\.(.*)$/"> RewriteRule (.*) https://%1%{REQUEST_URI} [R=301,L] </If>
配置说明
- 用
R=301代替临时跳转R,对搜索引擎更友好,测试阶段可以先用R=302避免缓存影响 - 规则2中用正则捕获
%1提取www后面的根域名,直接拼接作为跳转目标,避免出现域名重复拼接的问题 - 每个规则末尾加
L标记,匹配成功后终止后续规则判断,不会产生多余匹配开销
内容的提问来源于stack exchange,提问作者cjanow
相关产品推荐
相关产品推荐

