2010-09-25 22:09apche有rewrite_module 模块 LoadModule rewrite_module modules/mod_rewrite.so 在<VirtualHost下面家 RewriteEngine on RewriteCond %{HTTP_REFERER} !^http://www.zenghaofeng.com/.*$ [NC] RewriteRule .*.(mp3|jpeg)$ http://www.zenghaofeng.com/ [R,NC] #RewriteLog "logs/rewrite.log" #RewriteLogLevel 3 如果是需要在目录中以.htccess文件控制可以这样写: 在编译Apache时加入--enable-rewrite把mod_rewrite编译进去,如果是1.3.x版本需要在ttpd.conf开启 LoadModule rewrite_module libexec/mod_rewrite.so 并且在Addmodule中有 Addmodule mod_rewrite.c 则可以使用重写规则.如果是2.x版本编译后就有加载,用/usr/local/apache2/bin/httpd -L|grep rewrite可以看到: RewriteEngine (mod_rewrite.c) RewriteOptions (mod_rewrite.c) RewriteBase (mod_rewrite.c) RewriteCond (mod_rewrite.c) RewriteRule (mod_rewrite.c) RewriteMap (mod_rewrite.c) RewriteLock (mod_rewrite.c) RewriteLog (mod_rewrite.c) RewriteLogLevel (mod_rewrite.c) 说明已经支持mod_rewrite. 当外部请求来到Apache,Apache调用重写规则中的定义来重写由用户浏览器指定请求的URI,最后被重写的URI如果是重定向,则送由浏览器作再一次请求;如果是代理则把重写后的URI交给代理模块请求最终的内容(Content),最后把内容送回给浏览器. 接着确定httpd.conf中需要防盗的<directory XXX>容器中设置有: Options Indexes FollowSymLinks AllowOverride all 即开启.htaccess文件的使用权.否则你的.htaccess不会工作. 在该目录中创建.htaccess文件,加入以下代码: RewriteEngine on RewriteCond %{HTTP_REFERER} !^http://zenghaofeng.com[/size]/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://zenghaofeng.com$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.zenghaofeng.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.zenghaofeng.com$ [NC] RewriteRule .*.(mp3|gif|jpg|png)$ http://www.zenghaofeng.com [R,NC] 这里需注意的是,mp3 swf这样设置后,在自己的网站上也不能用播放器播放了,只能提供下载。因为这种防盗链是基于referer(来源地址的)但是,播放器是不发送来源地址。 --------------------------------------------------------- 以下的.htaccess放置在站点http://test1的/abc/下。 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} ^/abc/(allow1|allow2) RewriteRule ^.*$ - [L] RewriteCond %{REQUEST_FILENAME} \.(gif|jpg|png)$ [NC] RewriteCond %{HTTP_REFERER} !^$ [NC] RewriteCond %{HTTP_REFERER} !test1 [NC] RewriteCond %{HTTP_REFERER} !eschool [NC] RewriteCond %{HTTP_REFERER} !google\.com [NC] RewriteCond %{HTTP_REFERER} !baidu\.com [NC] RewriteRule (.*) /abc/allow1/0.jpg [R,NC,L] </IfModule> 注意: 1. RewriteCond %{REQUEST_URI} ^/(allow1|allow2) 当用http://test1/abc/allow1/0.jpg访问之时%{REQUEST_URI}值为/abc/allow1/0.jpg 2. RewriteCond %{REQUEST_FILENAME} \.(gif|jpg|png)$ [NC] 当用http://test1/abc/allow1/0.jpg访问之时%{REQUEST_FILENAME}值为/data/apache/htdocs/test1/abc/allow1/0.jpg是系统的绝对路径文件。 3. RewriteCond %{HTTP_REFERER} !^$ [NC] 当用直接在浏览器中输入http://test1/abc/allow1/0.jpg访问之时%{HTTP_REFERER}值为"". 请在test1站点的根目录下放一下文件:index.html内容如下: <html> <head><title>测试</title> </head> <body> <div> test pic: <img src="/abc/2.jpg"/> </div> </body> </html> 这时%{HTTP_REFERER}值为"http://test1". 4.语意说明: RewriteCond %{REQUEST_URI} ^/abc/(allow1|allow2) RewriteRule ^.*$ - [L] 这两句的意思是当 /abc/下的目录allow1与allow2内的文件是可以直接访问的,没有限制。 RewriteCond %{REQUEST_FILENAME} \.(gif|jpg|png)$ [NC] 指访问的文件是图片文件。 RewriteCond %{HTTP_REFERER} !^$ [NC] 不是直接在浏览器中直接访问图片的。 RewriteCond %{HTTP_REFERER} !test1 [NC] 不是来自 test1站点 RewriteCond %{HTTP_REFERER} !eschool [NC] 不是来自 eschool站点 RewriteCond %{HTTP_REFERER} !google\.com [NC] 不是来自 google站点 RewriteCond %{HTTP_REFERER} !baidu\.com [NC] 不是来自 baidu站点 RewriteRule (.*) /abc/allow1/0.jpg [R,NC,L] 当上面这几个条件都成立时则rewrite到/abc/allow1/0.jpg文件。R指的是用外转向,NC指匹配时不区分大小写,L指这时最后一条转向指令,以下的都不执行。 最后我们来次实战演练: 我现在为为showbiz88.com加图片防盗链的功能 1.我的图片文件夹在站点的/files/photo/下,把内容如下的.htaccessy文件也放在/files/photo/下。 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} ^/files/photo/allow1 RewriteRule ^.*$ - [L] RewriteCond %{REQUEST_FILENAME} \.(gif|jpg|png)$ [NC] RewriteCond %{HTTP_REFERER} !^$ [NC] RewriteCond %{HTTP_REFERER} !talent [NC] RewriteCond %{HTTP_REFERER} !showbiz88.com [NC] RewriteCond %{HTTP_REFERER} !google\.com [NC] RewriteCond %{HTTP_REFERER} !baidu\.com [NC] RewriteRule (.*) /files/photo/allow1/0.png [R,NC,L] </IfModule> ========================================= 位置一般情况下在 /usr/local/apache/conf/httpd.conf 或者apache 2.2 的 /usr/local/apache2/conf/extra/httpd-vhost.conf 添加 SetEnvIfNoCase Referer "^http://www.ccvita.com" local_ref=1 SetEnvIfNoCase Referer "^http://ccvita.com" local_ref=1 <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> Order Allow,Deny Allow from env=local_ref </filesmatch> 其中粗体的是您的网址,如果有多个,就加多行 斜体的是您需要防盗链的文件后缀,中间用|隔开 还一种写法,是用正则的,这种写法在各个版本的apache比较通用。 写法是 SetEnvIfNoCase Referer "^<strong>http://.*\.yourdomin\.com</strong>" local_ref=1 SetEnvIfNoCase Referer "<strong>.*\.yourdomin\.com</strong>" local_ref=1 <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> Order Allow,Deny Allow from env=local_ref </filesmatch> 其中粗体的部分有一点区别,用正则写法, \ 符号代表转义,因为.本身在正则中有自己的作用。 上面说的是Apache防盗链的使用,现在来说Apache防盗链的破解,说简单点Apache防盗链是通过来路来确定用户是否盗链的,如果自己写采集程序的话,我们完全可以利用php的curl_setopt函数中CURLOPT_REFERER和CURLOPT_USERAGENT这个两个函数去模拟referer和useragent的。 =------------------------------------------------------------------------------------- 1.利用rewrite 确认你的apache 能使用rewrite mod RewriteEngine on RewriteCond %{HTTP_REFERER} !^http://linuxsky.net[/size]/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://linuxsky.net$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.linuxsky.net/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.linuxsky.net$ [NC] RewriteRule .*.(gif|jpb|png|css|js|swf])$ http://www.linuxsky.net [R,NC] 其中有色的地方都是要改为你的: 红色:就是改为你提供下载页面的地址,也就是只有通过这个地址才可以下载你所提供的东东。 蓝色:就是要保护文件的扩展名(以|分开),也就是说以这些为扩展名的文件只有通过红色的地址才可以访问。 绿色:如果不是通过红色的地址访问蓝色这些为扩展名的文件时就回重定向到绿色地址上。 2.利用SetEnvIfNoCase 和 access SetEnvIfNoCase Referer "^http://linuxsky.net" local_ref=1 SetEnvIfNoCase Referer "^http://www.linuxsky.net" local_ref=1 <FilesMatch ".(gif|jpb|png|css|js|swf)"> Order Allow,Deny Allow from env=local_ref </FilesMatch> 红色为信任站点,蓝色为受保护的文件扩展名。 闪人,如果你有比较好的方式去模拟referer和useragent一定要告诉我,我对采集和模拟浏览器比较有兴趣
防盗链 apache 整理2010-09-25 22:21http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么。 因此所有防盗链方法都是基于这个Referer字段 主要有两种方法实现第一种:使用FilesMatch<VirtualHost *:80> ServerAdmin laogui@gmail.com DocumentRoot D:/www/www.chinahtml.com ServerName www.aaa.com ServerName aaa.com 盗用连接指定显示的页面。也可以不用此项,这样盗用连接也可无法使用。 ErrorDocument 404 http://www.chinahtml.com/error.html 允许www.aaa.com的网站使用 SetEnvIfNoCase Referer "^http://www.aaa.com" local_ref=1 允许 aaa.com 的网站使用 SetEnvIfNoCase Referer "^http://aaa.com" local_ref=1 定义防盗文件的扩展名 <FilesMatch "\.(gif|jpg|png|css|js|swf)"> Order Allow,Deny Allow from env=local_ref 允许上面指定域名 </FilesMatch> </VirtualHost>防盗链设置样本:使用正则表达式 SetEnvIf Referer "^http://(.)+\.ilinux\.cn/" local_ref=1 SetEnvIf Referer "^http://(.)+\.isql\.cn/" local_ref=1 #SetEnvIf Referer "^http://(.)+\.other\.org\.cn/" local_ref=1 SetEnvIf Request_URI "/logo(.)+" local_ref=0 <FilesMatch "\.(mp3|wmv|png|gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip|mp3)"> Order Allow,Deny Allow from env=local_ref </FilesMatch> 解释: 1. 蓝色部分,表示设置允许访问的referer地址,第一行的意思为所有http协议访问,以.ilinux.cn结尾的域名地址,第二行类似,只是换成 了.isql.cn,表问我前面的鬼符是什么,不懂得可以去翻正则表达式的研究文献,不想深究的可以照猫画虎设置自己的网站。 2. 绿色部分,表示不在上述引用域名范围内,但可以被放行的特例,本例中表示网站/目录,所有以logo开头的文件(用作允许其它网站的友情连接引用本站logo)。 3. 橙色部分是设置反盗链的关键部分,上面每一个设置都联系到了local_ref这个环境变量,只有这个变量为1,则允许被引用,否则显示一个X。 4. 紫色部分设置了哪些扩展名的文件加入反盗链的规则。 第二种方法: 使用rewirte方式: RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://bbs.ilinux.cn/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://bbs.ilinux.cn$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.ilinux.cn/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.ilinux.cn$ [NC] RewriteCond %{HTTP_REFERER} !^http://ilinux.cn/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://ilinux.cn$ [NC] RewriteRule .*\.(gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip)$ http://www.ilinux.cn [R,NC] 上面的,需要Rewrite模板.所有指定的文件,如果Referer不是上面的值,将被重定向到首页. 还有使用.htaccess 文件的方法,不过不推荐使用,影响apache性能。写一个.htaccess 包括以下代码: SetEnvIfNoCase Referer "^http://google\.com/" local_ref=1 <FilesMatch "\.(jpg)"> Order Allow,Deny Allow from env=local_ref Allow from 127.0.0.1 Allow from 123.123.123.123 </FilesMatch> 如果你的网址是www.myst.cn就改为 SetEnvIfNoCase Referer "^http://www\.myst\.com/" local_ref=1 <FilesMatch "\.(jpg)"> 这意思是说防止人家连结你的jpg档案.可以增修为 <FilesMatch "\.(jpg|zip|rar)"> ps.最后一个不使用区各线 Allow from 127.0.0.1 这表示允许连结主机的IP。 你要是默认其他网站可以连结的话,就填入该主机IP,把上述的code储存为.htaccess然后放入你安装的目录下即可。*nix系统在apache配置文件里面打开使用.htaccess功能。AllowOverride All ---------------------------------------------------------------------------------------------------------- 其实就是用Cookie,配合Apache的URL Rewrite模块很简单的就能实现防盗链下载。 首先在浏览页面的时候,会向客户端发送一个特别的Cookie,例如“Site=jzxue.Com“,盗链而来的将没有这个Cookie。 在Apache的httpd.conf文件里面搜索: #LoadModule rewrite_module modules/mod_rewrite.so 把它前面的#去掉,再找到<Directory />块,在里面加入类似如下代码: <Directory /> # Other configurations … RewriteEngine On # 启动URL Rewrite引擎 RewriteCond %{HTTP_COOKIE} !^.*(?:Site=jzxue.Com).*$ # 对于Cookie里面没有特殊记录的请求进行重定向 RewriteRule ^.*$ error.html # 将非法访问重定向到错误页面 </Directory> 这样如果一个盗链而来的请求将会因为没有特殊Cookie而被重定向到错误页面,就算实际地址暴露也不怕。至于这个Cookie的内容是什么以及有效时间完全可以由管理员自己来设定,也就是说下载工具也没法伪造,从而防止了服务器资源被盗链的危险。 限制客户端多线程下载 限制多线程现在需要用到一个Apache的扩展模块mod_limitipconn,这里是作者的官方网站http://dominia.org/djao/limitipconn2.html,先下载适合自己版本的模块文件到Apache安装目录下的modules目录下面,然后在httpd.conf文件中搜索: #LoadModule status_module modules/mod_status.so 把它前面的#去掉,再加入: ExtendedStatus On LoadModule limitipconn_module modules/mod_limitipconn.dll # 如果你下载的不是Win版,请把后面的文件名改为你所下载的文件名 <IfModule mod_limitipconn.c> <Location /> # 这里表示限制根目录,即全部限制,可以根据需要修改 MaxConnPerIP 2 # 这里表示最多同时两个线程 NoLimit html/* # 这里表示html目录下不受限制 </Location> </IfModule> 这样来自同一客户端的超过2个的线程请求将被拒绝,从而限制了客户端的多线程下载。 限制下载带宽 这个同样需要扩展模块支持,模块是mod_bw,在作者的官方网站http://ivn.cl/apache/可以下载到。同样也是放入modules目录下面,然后在httpd.conf文件中加入: LoadModule bw_module modules/mod_bw.dll 再找到<Directory />块,加入: <Directory /> # Other configurations … BandwidthModule On # 启动带宽限制 ForceBandwidthModule On # 启动带宽限制 MaxConnection all 2000 # 最大连接数2000 Bandwidth all 200000 # 单个客户端最大带宽200KB </Directory> 这样限制了同时最多2000个连接数,每个客户端最大200KB的下载带宽。 到此,我们的完美限制的HTTP下载服务器就配置完成了,重新启动你的Apache这些功能便能生效了。因为Apache和这些模块都是开源免费 的,我们不需要为此掏一分钱,不用去购买那些第三方的软件,只是需要多去了解一下这些软件的使用说明。不要一切都祈祷有现成美好的东西,自己动手做一次会 有不一样的收获