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

mod_rewrite规则中@符号的含义解析——PDF防盗链.htaccess规则疑问

拆解.htaccess规则中@符号的作用

嘿,这个问题问得很细节!我来给你解释清楚这个@符号到底是干嘛的~

首先,我们先看这条RewriteCond的完整结构:

RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@http?://\1/.*

这里的@@其实是自定义的分隔符,目的是把%{HTTP_HOST}(当前请求的域名)和%{HTTP_REFERER}(请求的来源页面URL)这两个Apache环境变量拼接成一个单一的字符串,方便用正则表达式同时对比两者的关系。

举个实际例子:

  • 如果当前域名是example.com,请求来源是http://example.com/article.html,拼接后的字符串就是example.com@@http://example.com/article.html
  • 如果是直接通过URL访问PDF(没有referer),拼接后的字符串就是example.com@@(或者只有example.com,取决于服务器配置)

接下来看正则部分!^([^@]*)@@http?://\1/.*:

  1. ([^@]*):匹配第一个@符号之前的所有内容,也就是捕获到当前的域名(%{HTTP_HOST}的值)
  2. @@:就是我们加的分隔符,用来精准定位到拼接字符串里两个变量的分界点
  3. http?://\1/.*:检查拼接字符串的后半部分(也就是%{HTTP_REFERER})是否以http://或https://开头,后面跟着刚才捕获的域名,再加上任意路径内容

整个条件的意思是:当请求的来源页面域名和当前网站域名不一致,或者没有来源页面(直接URL访问)时,就触发后面的RewriteRule,返回403禁止访问(F标记)。

为什么要用@@而不是单个@?其实主要是为了避免极端情况——虽然正常情况下%{HTTP_HOST}(域名)和%{HTTP_REFERER}(URL)里不会出现@符号,但用两个@作为分隔符,能进一步确保分隔的唯一性,避免正则匹配出错。

简单来说,这里的@符号没有特殊的Apache或正则语法含义,只是一个用来分隔两个变量的普通字符,让我们能在一个正则表达式里同时验证域名和来源的一致性~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:42:38