【问题标题】:RewriteCond expr with Optional parts and Server variables带有可选部分和服务器变量的 RewriteCond expr
【发布时间】:2023-03-21 03:28:01
【问题描述】:

在我寻求“盗链保护”的过程中,我将 REFERER 与 HOST 进行比较,并且我想在 REFERER 中允许可选的 PORT (3000)。

我有 2 位候选人可以胜任这份工作,他们都缺少一些东西。

RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
RewriteCond expr "%{HTTP_REFERER} !~ m#.*?://%{HTTP_HOST}(:3000)?/.*?#"

Apache 的文档没有太大帮助...

第一行使用-strmatch,据我所知不支持可选部分-类似于正则表达式(:3000)?。它只支持通配符 *,?和 []。我没有找到任何规格 - 从我的 exps * 匹配任何字符串,包括。空一个,?应该是任何单个字符,[] 可以用于类似于正则表达式的字符范围。

第二行使用正则表达式 (!~,=~),这很好,但我找不到将 HTTP_HOST 服务器变量插入其中的方法。

任何人都对如何在 strmatch 中具有可选部分或将服务器 var 插入正则表达式有一定的经验。

【问题讨论】:

    标签: regex apache mod-rewrite hotlinking


    【解决方案1】:

    official doc 看来,regpattern 不允许使用变量。它只定义为:

    regpattern ::= cstring ; except enclosing regsep
    

    您可以使用此变通方法通过在条件中组合这两个变量来完成您的工作:

    RewriteCond %{HTTP_HOST}#%{HTTP_REFERER} ^([^#]+)#.*//:\1(:3000)?/.*$
    

    这里\1 是第一个捕获组的反向引用,即([^#]+),它代表%{HTTP_HOST} 值。


    另一种选择是使用&& 并有两个条件:

    RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*' && ! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}:3000/*"
    

    【讨论】:

    • 这是一个解决方案(虽然有点 hacky)。然而,在 RewriteCond 中支持 expr,至少在我的开发者和我的虚拟主机 apache 中,第一行在这种形式下是完全可用的。它只是不承认端口。
    • 你是对的。我签入了最新的 Apache,它是受支持的。让我更新我的答案。
    • 从这个文档中可以看出:httpd.apache.org/docs/trunk/expr.html regpattern 不允许使用变量。仅定义为:regpattern ::= cstring ; except enclosing regsep
    猜你喜欢
    • 2014-10-18
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2012-07-24
    • 2017-06-24
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多