欢迎各位兄弟 发布技术文章
这里的技术是共享的
http标准协议中有专门的字段记录referer
一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么。
因此所有防盗链方法都是基于这个Referer字段
网上比较多的2种
一种是使用apache 文件FileMatch限制,在httpd.conf中增加 ( 其实也可以将把下面的语句存成一个.htaccess文件),并放到你的网站 的根目录(就是www/html目录),这样子别人就没有办法盗连你的东东了~~
这种很方便禁止非允许访问URL引用各种资源文件
请大家注意,把第一句"^http://yahoo.com/"改为你的网站,比如我的网站是: http://www.linji.cn
我应该这么写的 "^http://www.linji.cn/"
第二种是使用rewrite,需要增加apache的mode_rewrite,支持.htaccess文件目录权限限制
在虚拟主机根目录增加.htaccess文件,描述从定向,把非本地地址refer的图片文件都从定向到警告图片或者警告网页上。
首先要确认你的服务器 或空间的服务器解译引擎为Apache2,还有支持.htaccess客户设置文件,如果你有自己的服务器就请先对./conf/httpd.conf 文件做以下修改 找到:#LoadModule rewrite_module modules/mod_rewrite.so
把前面的 # 给去掉
找到第一个 AllowOverride None 改为 AllowOverride All 重启Apache2服务器
接下就是做一个 .htaccess 文件了,其 .htaccess 文件内容为
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://aaoo.net/ .*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://aaoo.net $ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.aaoo.net/ .*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.aaoo.net $ [NC]
RewriteRule .*.(jpg|jpeg|gif|png|bmp|rar|zip|exe )$http://down.yoyo.com.ru/err.html [R,NC,L]
其中有色的地方都是要改为你的:
红色 :就是改为你提供下载页面的地址,也就是只有通过这个地址才可以下载你所提供的东东。
蓝色 :就是要保护文件的扩展名(以|分开),也就是说以这些为扩展名的文件只有通过红色的地址才可以访问。
绿色 :如果不是通过红色的地址访问蓝色这些为扩展名的文件时就回重定向到绿色地址上。
这个方法有个好处是,不同的虚拟主机用不同的描述定义。
接下就是怎么用 .htaccess 文件来实现防盗链了。首先要在空间上建两个目录(当然目录名随你),一个为 web 另一个为 down ,web 是用来放下载页面的(或下载程序),down 当然就是放你提供的东东的啦,把 .htaccess 文件的红色部分改一下,改为http://你的域名/web。蓝色部分改为你要保护文件的扩展名。绿色部分改为http://你的域名/web。改后保存.htaccess 文件把它上传到 down 目录。
实例:
简单的解释一下上述语句:
1、RewriteCond %{HTTP_REFERER} !^$ [NC]
允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。
2、RewriteCond %{HTTP_REFERER} !webeta.cn [NC]
设置允许访问的HTTP来源,包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。
3、RewriteRule .*\.(gif|jpg|png)$ http://www.aaa.com/no.png [R,NC,L]
定义被盗链时替代的图片,让所有盗链 jpg、gif、png 等文件的网页,显示根目录下的 no.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:
RewriteRule .*\.(gif|jpg|png)$ - [F]
4、说明一下其中的R、NC 和 L
R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响
5、防止盗链的文件类型
上例中是 gif、jpg、png,而根据需要,可更改或添加其他文件类型,如rar、mov等,不同文件扩展名间使用“|”分割。
这样的话,就可以基本做到简单的防止被盗链情况的发生,而且可以尽最大可能的减少服务器流量的无畏消耗,当然了,如果你不在意这点流量的话,那么可以不用考虑上述设置啦!
haccess在线编辑工具
中文化界面(支持十种语言,包括正体中文),功能比较完善:
支持:
还有第三种:
我在解决blog禁止盗链的时候,发现个问题,也算个好方法。blog把所有资源都自己管理起来,用resserver.php来动态显示,这样统一的入口方便添加权限操作。同时造成上面2种方法无法使用,因为不再是apache直接访问资源文件,而是php 通过文件读取。
因此只能在代码 中做手脚:在读取资源文件输出之前,加如下判断代码
这里有些偷懒,直接看引用地址中是否包含host地址,不过原理就是这样,判断referer是否是本站地址。我们常常在下载的时候,也碰到盗链网站无法下载,报盗链的问题。要下载这类文件最简单的方法就是改referer比方flashget中,网址下面的"引用"一栏中,直接填写下载地址就可以了。
.htaccess是一个完整的文件名,不是***.htaccess或其它格式(当然也有管理员把其设置 成其它名字,但一般都是使用.htaccess)。另外,上传.htaccess文件时,必须使用ASCⅡ模式,并使用chmod命令改变权限 为:644(RW_R__R__) 。每一个放置.htaccess的目录和其子目录都会被.htaccess影响。例如,在/abc/目录下放置了一 个.htaccess文件,那么/abc/和/abc/def/内所有的文件都会被它影响,但/index.html不会被它影响,这一点是很重要的。
实例功能 :文档访问的密码保护
要利用.htaccess对某个目录下的文档设定访问用户和对应的密码,首先要做的是生成一个.htpasswd的文本文档,例如:
zheng:y4E7Ep8e7EYV
这里密码经过加密,用户可以自己找些工具将密码加密成.htaccess支持的编码。该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。
有了授权用户文档,可以在.htaccess中加入如下指令了:
注,括号部分为学习 时候自己添加的注释
来自 http://justcoding.iteye.com/blog/547364
apache url rewrite 的RewriteRule参数详解 我们经常会在apache那边对一些url进行一些重写操作,那么就会涉及到很多的重写策略的选择,比如重定向的方式,参数的处理,规则匹配的顺序等。 比如我们某个应用会有下面的url rewrite规则:下面是对于域名imall.test.com访问的时候需要重定向到http://page.test.com/channel/imall/index.html这个url上, <VirtualHost *> ServerName imall.test.com#if("${industry_port}"!="80"):${industry_port}#end RewriteEngine on RewriteCond %{HTTP_HOST} =imall.test.com [NC] RewriteRule ^/$ http://page.test.com/channel/imall/index.html [L,R] </VirtualHost> 之前是想上面这么写的,但是发现浏览器的url变了,也就是R其实是外部重定向,那么我希望浏览器的url不改变,那么就需要内部重定向或者反向代理的设计。此时只能参考官方文档了:http://httpd.apache.org/docs/2.2/rewrite/flags.html 这里列出很多的参数:在每条规则后面可以加上多个参数,每个参数用逗号分隔 RewriteRule pattern target [Flag1,Flag2,Flag3] B (escape backreferences):非字母字符会被编码, 比如有个url为search.phpterm=x & y/z,那么此时不设置B参数时会被编码成search.phpterm=x%20&y%2Fz=,也是不对的,那么设置B参数之后会被编码成/search.phpterm=x%20%26%20y%2Fz,这样对于url rewrite的规则才能被正确解析转发。 C|chain 如果匹配,会继续匹配下一条规则,如果不匹配则跳过后面所有规则; CO|cookie 可以给当前url设置cookie,规则如:[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly] 示例: RewriteEngine On RewriteRule ^/index\.html - [CO=frontdoor:yes:.example.com:1440:/] DPI|discardpathinfo 丢弃PATH_INFO 信息 E|env 设置环境变量 [E=VAR:VAL] [E=!VAR] 示例: RewriteRule \.(png|gif|jpg) - [E=image:1] CustomLog logs/access_log combined env=!image F|forbidden 直接返回403状态码 RewriteRule \.exe - [F] G|gone 返回410 状态码,表示资源不再可用 RewriteRule oldproduct - [G,NC] H|handler 指定请求被某个handler处理,下面这个url表示被php处理引擎处理 RewriteRule !\. - [H=application/x-httpd-php] L|last 匹配了就不再匹配后面的规则 RewriteBase / RewriteCond %{REQUEST_URI} !=/index.php RewriteRule ^(.*) /index.phpreq=$1 [L,PT] N|next 重新从第一条规则开始匹配 RewriteRule (.*)A(.*) $1B$2 [N] NC|nocase 大小写不敏感 RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC] NE|noescape 不转码特殊字符,默认是会把&,?等特殊字符转成16进制编码, RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R] NS|nosubreq 规则不作用于子请求上, SSI (Server Side Include) P|proxy 做为反向代理转发请求,这样浏览器url就不会改变 RewriteRule /(.*)\.(jpg|gif|png) http://images.example.com/$1.$2 [P] PT|passthrough url作为一个文件路径处理 Alias /icons /usr/local/apache/icons RewriteRule /pics/(.+)\.jpg /icons/$1.gif [PT] QSA|qsappend 带上query参数 RewriteRule /pages/(.+) /page.phppage=$1 [QSA] R|redirect 重定向 默认302 重定向 S|skip 跳过不想执行的规则匹配 # Is the request for a non-existent file RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # If so, skip these two RewriteRules RewriteRule .- [S=2] RewriteRule (.*\.gif) images.php$1 RewriteRule (.*\.html) docs.php$1 T|type 指定MIME type 类型 # Serve .pl files as plain text RewriteRule \.pl$ - [T=text/plain] # Files with 'IMG' in the name are jpg images. RewriteRule IMG - [T=image/jpg]
例子:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。
例子:
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php
限制目录只能显示图片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
< /IfModule>