.htaccess多RewriteCond不生效:需带testheader头访问output目录
.htaccess防盗链配置失效排查
我有一个名为output的图片目录,需要配置防盗链:默认拦截所有访问该目录的请求,仅允许携带testheader请求头(值可为空)的请求访问。
当前使用的.htaccess配置如下:
RewriteCond "%{REQUEST_URI}" ".*output.*" RewriteCond "{%HTTP:testheader}" "!^$" RewriteRule ^ - [F]
但配置无法正常工作——仅保留第一条RewriteCond时功能正常,加上第二条后规则失效。我用以下JavaScript的XHR请求(携带空值的testheader头)测试加载图片:
var xhr = new XMLHttpRequest(); xhr.responseType = 'blob'; // 让响应可以像普通URL一样访问 xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { var img = document.createElement('img'); img.src = URL.createObjectURL(xhr.response); // 创建src为blob的<img>元素 document.body.appendChild(img); } }; xhr.open('GET', 'https://www.example.com/output/test.png', true); xhr.setRequestHeader('testheader', ''); xhr.send();
失效原因分析
- 语法错误:第二条RewriteCond里的
{%HTTP:testheader}格式错误,正确的请求头变量写法是%{HTTP:testheader},多出来的左花括号会导致Apache无法正确解析请求头的值。 - 逻辑反转:当前配置的逻辑是「当URI包含output 且 testheader不为空时,拦截请求」,这和需求完全相反。我们需要的是「当URI包含output 且 testheader不存在/值为空时,拦截请求」。
修正后的配置
RewriteEngine On RewriteCond %{REQUEST_URI} .*output.* RewriteCond %{HTTP:testheader} ^$ RewriteRule ^ - [F]
- 第一条规则匹配所有访问
output目录的请求 - 第二条规则匹配没有携带testheader头,或者头值为空的请求
- 同时满足前两条时,返回403禁止访问;反之,只要携带了testheader头(哪怕值为空),请求就会被允许通过。
内容的提问来源于stack exchange,提问作者Oempff
相关产品推荐
相关产品推荐

