Apache 2:Referer 来自当前主机

Apache 2:Referer 来自当前主机

我有一个带有 mod_setenvif 的 Apache 2。我的目标是停止我服务器上所有图片的热链接全局 apache.conf。目前是:

<FilesMatch ".(gif|jpg|jpeg|png)$">
    SetEnvIfNoCase Referer "^http://[^/]*blogger.com/" hotlink
    SetEnvIfNoCase Referer "^http://[^/]*myspace.com/" hotlink
    SetEnvIfNoCase Referer "^http://[^/]*ebay" hotlink
    ...
    deny from env=hotlink
</FilesMatch>

到目前为止运行良好,但我必须捕获每个热链接器一次并将其添加到我的配置中。我希望通过添加类似以下内容来获得更广泛的方法:

    # Set variable "hotlink" if Referer contains "forum"
    SetEnvIfNoCase Referer "forum" hotlink

    # Unset variable if Referer is from the same Host as current request
    SetEnvIfNoCase Referer %{Host} !hotlink

计划是匹配http://邪恶主机.com/论坛/, 但不是http://我的主机.com/论坛/

问题是后者的取消设置不起作用。看起来我不能使用标头属性“Host”作为正则表达式模式 - 至少不是我尝试的方式。当然,我可以手动输入配置中所有可能的主机名,但这正是我想要避免的。

我的问题是:

  • 有没有办法使用 HTTP 标头作为正则表达式模式?
  • 如果没有,您是否知道还有什么方法可以达到我的目标,即如果引荐来源来自同一主机,则取消设置变量“hotlink”?

答案1

您可以通过执行以下操作来动态阻止热链接:

RewriteCond "%{HTTP_HOST}_%{HTTP_REFERER}" !\.?([^\.]+\.[^\.]+?)_https?://.*\1/.*$ [NC]
RewriteRule .(gif|jpg|jpeg|png)$ . [F,L]

答案2

(这开始是一条评论但变得太长了......)

您的图片是否真的被访问许多不同的本地主机名?因为在我维护的大多数网站上,任何单个虚拟主机通常都与两个主机名相关联(通常类似于 example.com 和 www.example.com)。你确定你不是在尝试解决一个不存在的问题吗?

您可以使用 mod_rewrite 而不是 FilesMatch 来实现您想要的效果(因为这样您就可以%{HTTP_HOST}在匹配字符串中使用,这意味着您不再需要担心输入所有本地主机名)。简单的谷歌搜索就能得到那么多不同的本地主机名?因为在我维护的大多数网站上,任何单个虚拟主机通常都与两个主机名相关联(通常类似于 example.com 和 www.example.com)。您确定您不是在尝试解决不存在的问题吗?

您可以使用 mod_rewrite 而不是 FilesMatch 来实现您想要的效果(因为这样您就可以在匹配字符串中使用 %{HTTP_HOST},这意味着您不再需要担心输入所有本地主机名)。简单的谷歌搜索可以得出本网站,其中详细介绍了如何使用 RewriteRule 来阻止热链接。

答案3

我首先想到的是(例如,我还没有真正仔细考虑过这个问题),你为什么不反过来考虑你的逻辑呢?

<FilesMatch ".(gif|jpg|jpeg|png)$">
    SetEnvIfNoCase Referer "^http://[^/]evilhost.com/" localref

    Order deny,allow
    deny from all
    allow from env=localref
</FilesMatch>

相关内容