如何在.htaccess中配置CDN别名服务器的静态文件重写规则?
解决方案
要实现你需要的逻辑,核心是从请求的Host头中提取可变的CDN子域名部分,构造对应的实际文件路径进行存在性检查,具体的Apache Rewrite规则如下(放置在httpdocs/.htaccess中):
# 从Host头提取CDN子域名的后缀部分(如cdn-x.domain.com提取x) RewriteCond %{HTTP_HOST} ^cdn-([a-z0-9-]+)\.domain\.com$ [NC] # 将提取到的CDN标识存入环境变量 RewriteRule ^ - [E=CDN_ID:%1] # 检查对应CDN目录下的文件/目录是否存在 RewriteCond %{DOCUMENT_ROOT}/../cdn/%{ENV:CDN_ID}%{REQUEST_URI} !-f RewriteCond %{DOCUMENT_ROOT}/../cdn/%{ENV:CDN_ID}%{REQUEST_URI} !-d # 文件不存在时转发到PHP脚本 RewriteRule ^(.*)$ notfound.php?val=$1 [L,QSA]
规则说明:
- 提取CDN标识:通过
%{HTTP_HOST}匹配请求域名,用正则捕获cdn-后的子域名部分(如x、y),存入环境变量CDN_ID,[NC]表示不区分大小写匹配。 - 构造实际路径:利用
%{DOCUMENT_ROOT}获取当前虚拟主机根目录(即httpdocs),通过../跳转到同级的cdn目录,拼接CDN_ID和请求URI,形成完整的实际文件路径。 - 存在性校验:通过
!-f和!-d判断该路径下是否无对应文件或目录。 - 转发处理:当文件不存在时,将请求转发到
notfound.php,[QSA]确保原请求的查询参数能被一并传递。
注意事项:
- 确保Apache的
mod_rewrite模块已启用。 - 验证服务器权限,保证Apache进程能访问
../cdn目录下的文件。 - 若域名后缀有变动,需调整
%{HTTP_HOST}的正则匹配规则。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

