【问题标题】:Stop hotlinking using htaccess and non-specific domain code停止使用 htaccess 和非特定域代码进行热链接
【发布时间】:2013-07-03 17:17:12
【问题描述】:

我需要为我的 .htaccess 文件编写一个防盗链命令,但它不能特别针对任何域名。到目前为止,这是我在其他网站上发现的,但我不确定为什么它不起作用,有人能发现问题吗?

# Stop hotlinking.
#------------------------------
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/ [NC]
# Note the # is just used as a boundary. It could be any character that isn't used in domain-names.
RewriteCond %1#%{HTTP_HOST} !^(.+)#\1$
RewriteRule \.(bmp|gif|jpe?g|png|swf)$ - [F,L,NC]

【问题讨论】:

  • 注意:上面的代码基于另一个似乎不起作用的 Stackoverflow 帖子/答案。 link
  • 当我把它放在一个空白的 htaccess 中时,这对我有用,任何热链接图像都会返回 403,我在同一站点的页面上查看的每个图像都会返回 200。
  • @jon 嗨乔恩,我在下面提到由于某种原因它再次开始为我工作。我想我被那些在使用 SHIFT + 重新加载按钮刷新页面时根本不会清除缓存的浏览器迷惑了。尽管如此,我确实需要更多的帮助来理解这段代码是如何工作的,而 Ravi 做得很好。

标签: .htaccess hotlinking unknown-host


【解决方案1】:

试试这个。

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^https?://(www\.)?([^/]+)/.*$ [NC]
RewriteCond %2#%{HTTP_HOST} !^(.+)#(www\.)?\1$ [NC]
RewriteRule \.(bmp|gif|jpe?g|png|swf)$ - [F,L,NC]

当只有一个引荐来源网址或目标网址具有前导 www. 时,甚至可以工作

编辑:(这 % 的东西是如何工作的?)

%nlast 匹配的重写条件中引用 n(th) 括号的匹配内容。

所以,在这种情况下

  • %1 = www."" 空白(因为它是可选的;使用 ()? 来做到这一点)
  • %2 = yourdomain.com(总是不带www

所以,现在重写条件实际上试图匹配

yourdomain.com#stealer.com OR yourdomain.com#www.stealer.com

^(.+)#(www\.)?\1$ 表示(.+)## 之前的所有内容,然后是www.(但也是可选的);后跟\1 第一个括号的匹配内容(在此正则表达式内;不是重写条件),即# 之前的完全相同的内容。

因此,stealer.com 将无法通过正则表达式,而 yourdomain.com 将通过。但是,因为我们已经用! 否定了规则; stealer.com 通过了条件,因此应用了热链接停止规则。

【讨论】:

  • %2不能用于RewriteCond的模式参数中
  • @JonLin 啊,没错。突然间,OP 的状况现在对我来说很有意义。谢谢。
  • @Ravi 现在我真的很困惑,突然之间,我的第一个示例又开始工作了,从您进行最后一次编辑后的外观来看,您的代码建议与我的问题几乎完全相同代码。您能否指出您所做的具体改进以及为什么您认为它们是必要的?我对第 3 行的实际工作方式感到最困惑。 %2#%{HTTP_HOST} 到底是如何工作的?
  • 为什么要分离出(www\.)?,这不是自动包含在使用它的网站的HTTP_HOST字符串中吗?
  • 该死的 5 分钟超时...最初设置为 abc.com 且别名为 www.abc.com 的服务器是否只为 HTTP_HOST 输出 abc.com 而不管调用哪一个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2016-08-25
  • 2012-04-19
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多