【问题标题】:What does @ symbol mean in mod_rewrite rulesmod_rewrite规则中的@符号是什么意思
【发布时间】:2021-09-11 17:42:53
【问题描述】:

我正在寻找一种方法来防止从我网站上的直接 URL 访问我的 PDF 文件,我发现了这些 htaccess 规则:

RewriteEngine On
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@http?://\1/.*
RewriteRule .*\.pdf [NC,F]

尽管它看起来很完美,但我并不真正理解这些 @ 符号在 RewriteCond 规则中的含义。我对 regex 有一些基础知识,但在 apache 和 regex 文档上没有找到与这些相关的任何内容,而且我发现规则的文章没有提供任何信息。

有什么想法吗?

【问题讨论】:

    标签: apache .htaccess mod-rewrite apache2


    【解决方案1】:

    简答:它基本上是HTTP_HOST%{HTTP_REFERER} 值之间的分隔符。在RewriteCond 指令中执行条件检查时匹配它们的值。

    解释性答案: 现在为什么我们将这些 @@ 字符作为 2 个 apache 变量之间的分隔符。每当我们想比较 2 个值是 EQUAL 还是 SAME 时,它都很简单,然后我们就使用它,因为这有助于我们在捕获组中捕获值,然后如果条件中使用的反向参考值不相同,那么我们的条件将失败。

    现在来看看当前的场景:

    假设我们的域名是:www.example.comHTTP_REFERER 的值为:http://www.example.com/en-US/JavaScript

    那么%{HTTP_HOST}@@%{HTTP_REFERER} 会做的是: 它将使价值: www.example.com@@http://www.example.com/en-US/JavaScript

    现在来到 Cond 线的右侧: !^([^@]*)@@http?://\1/.*

    您会看到捕获组的值为www.example.com,当我们在http?://\1 中将其用作\1 时,它实际上会检查URL 是否为http://www.example.com/.*。如果它不等于,则继续请求 URI。

    基本上我们这样做的原因是因为没有直接的方法来检查 URI 中的 2 个值是否相等。

    关于改进规则的建议:

    RewriteEngine On
    RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@http?://\1/.*
    RewriteRule .*\.pdf/?$ - [NC,F]
    

    【讨论】:

    • 好的,我明白了,谢谢你的详细回答!
    猜你喜欢
    • 2014-03-10
    • 2010-09-29
    • 2011-04-18
    • 1970-01-01
    • 2011-04-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多