将所有图标重定向至子域名的规则优化及变量传递问题求助
优化后的Apache Rewrite规则方案
针对你提出的效率问题和非www条件下变量传递失效的问题,以下是优化后的规则及说明:
RewriteEngine On # 统一提取不带www的主机名,存入环境变量复用 RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*)$ [NC] RewriteRule ^ - [E=DOMAIN:%1] # 处理各类favicon文件跳转(统一301永久重定向,需临时重定向可改302) RewriteRule ^.*favicon\.(bmp|gif|jpe?g|ico|png|tif|tiff|webp)$ %{REQUEST_SCHEME}://ico.%{ENV:DOMAIN}/favicon.png [R=301,L,NC] # 处理其他ico文件跳转 RewriteRule ^(.+)\.ico$ %{REQUEST_SCHEME}://ico.%{ENV:DOMAIN}/$1.ico [R=301,L,NC]
优化细节:
- 效率提升:
- 仅做一次主机名正则匹配,通过环境变量
DOMAIN复用结果,避免重复编写相同的RewriteCond逻辑 - 合并重复的
RewriteRule,减少正则匹配次数,原规则中重复的favicon/ico匹配逻辑被整合为单条规则
- 仅做一次主机名正则匹配,通过环境变量
- 解决变量传递问题:
- 用
^(?:www\.)?(.*)$同时兼容带www和不带www的主机名,(?:...)为非捕获组,(.*)捕获去掉www后的核心域名存入%1 - 通过
E=DOMAIN:%1将捕获的域名存入环境变量,后续规则直接调用%{ENV:DOMAIN},不受RewriteCond临时变量仅作用于紧接规则的限制
- 用
- 重定向统一:原规则中favicon混用301和302,建议统一为301(永久重定向),若需临时跳转再改回302
特殊场景补充:
如果需要单独针对非www主机执行规则,可在提取域名后增加条件判断:
RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^特定路径$ 目标地址 [L]
内容的提问来源于stack exchange,提问作者user19897490
相关产品推荐
相关产品推荐

