You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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();

失效原因分析

  1. 语法错误:第二条RewriteCond里的{%HTTP:testheader}格式错误,正确的请求头变量写法是%{HTTP:testheader},多出来的左花括号会导致Apache无法正确解析请求头的值。
  2. 逻辑反转:当前配置的逻辑是「当URI包含output 且 testheader不为空时,拦截请求」,这和需求完全相反。我们需要的是「当URI包含output 且 testheader不存在/值为空时,拦截请求」。

修正后的配置

RewriteEngine On
RewriteCond %{REQUEST_URI} .*output.*
RewriteCond %{HTTP:testheader} ^$
RewriteRule ^ - [F]
  • 第一条规则匹配所有访问output目录的请求
  • 第二条规则匹配没有携带testheader头,或者头值为空的请求
  • 同时满足前两条时,返回403禁止访问;反之,只要携带了testheader头(哪怕值为空),请求就会被允许通过。

内容的提问来源于stack exchange,提问作者Oempff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:18:10