2

我需要为我的 .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]
4

1 回答 1

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.

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

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

所以,在这种情况下

  • %1= 要么www.""空白(因为它是可选的;曾经()?这样做)
  • %2= yourdomain.com(没有www总是)

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

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

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

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

于 2013-07-03T17:38:10.923 回答