欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

htaccess防盗链方法 有大用

shiping1 的头像

http标准协议中有专门的字段记录referer

一来可以追溯上一个入站地址是什么

二来对于资源文件,可以跟踪到包含显示他的网页地址是什么。

因此所有防盗链方法都是基于这个Referer字段

网上比较多的2种

一种是使用apache 文件FileMatch限制,在httpd.conf中增加 ( 其实也可以将把下面的语句存成一个.htaccess文件),并放到你的网站 的根目录(就是www/html目录),这样子别人就没有办法盗连你的东东了~~

 

Java代码  收藏代码
  1. SetEnvIfNoCase Referer "^http://yahoo.com/" local_ref=1  
  2.   
  3. Order Allow,Deny  
  4. Allow from env=local_ref  
  5. Allow from 127.0.0.1  
 

这种很方便禁止非允许访问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 目录。

 

 

实例:

 

Java代码  收藏代码
  1. <IfModule mod_rewrite.c>  
  2.   
  3. # 开启Rewrite模块   
  4. RewriteEngine On  
  5.   
  6. # 定义要保护的文件夹,建议只要保护上传文件夹(/wp-content/uploads/)就可以,主题文件夹之类的就算了  
  7. RewriteBase /wp-content/uploads/  
  8.   
  9. #允许空的来源,因为用户可能手动输入图片网址  
  10. RewriteCond %{HTTP_REFERER} !^$ [NC]  
  11.   
  12. #允许自己的网站访问啦   
  13. RewriteCond %{HTTP_REFERER} !photozero.net [NC]  
  14.   
  15. #允许几个常用的在线阅读器的访问   
  16. RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]  
  17. RewriteCond %{HTTP_REFERER} !xianguo.com [NC]  
  18. RewriteCond %{HTTP_REFERER} !google.com [NC]  
  19. RewriteCond %{HTTP_REFERER} !feedburner.com [NC]  
  20. RewriteCond %{HTTP_REFERER} !feedsky.com [NC]  
  21.   
  22. #括号中的是要保护的文件拓展名,这里只保护了 gif,jpg,png,再加上出错时的图片地址 unavailable.png   
  23. RewriteRule .*\.(gif|jpg|png)$ http://example.com/unavailable.png [R,NC,L]  
  24.   
  25. </IfModule>  

 

简单的解释一下上述语句:

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在线编辑工具 
中文化界面(支持十种语言,包括正体中文),功能比较完善:
支持:

  1. 是否显示文章列表(是否显示网站索引目录)
  2. 是否启用密码保护(可对单个目录启用密码保护)
  3. 各种错误页面设置(400     Bad Request401     Auth Req’d402     Payment Req’d403     Forbidden404     Not Found405     Method Not Allowed406     Not Acceptable407     Proxy Auth Repid408     Request Time Out409     Conficting Request410     Gone411     Content Len Req’d412     Precondition Failed413     Entity Too Long414     URI Too Long500     Int, Server Error501     Not Implemented502     Bad Gateway503     Service Unavailable504     Gateway Timeout505     HTTP Ver Not Sup…)
  4. 预设置页面(设置任意页面为主页)
  5. www转向设置(将www.重定向)
  6. 301 302转址(用来重定向)
  7. 存取限制(用来防盗链)
    现在 就去看看:http://www.htaccesseditor.com/sc.shtml

还有第三种:

我在解决blog禁止盗链的时候,发现个问题,也算个好方法。blog把所有资源都自己管理起来,用resserver.php来动态显示,这样统一的入口方便添加权限操作。同时造成上面2种方法无法使用,因为不再是apache直接访问资源文件,而是php 通过文件读取。

因此只能在代码 中做手脚:在读取资源文件输出之前,加如下判断代码

 

Php代码  收藏代码
  1. $referer = $_SERVER['HTTP_REFERER'];  
  2. $selfurl = $_SERVER['HTTP_HOST'];  
  3.   
  4. if(false == strpos($referer,$selfurl)){  
  5.     echo '非法盗链!';  
  6.     exit(1);  
  7. }  

 

这里有些偷懒,直接看引用地址中是否包含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中加入如下指令了:

Java代码  收藏代码
  1. AuthUserFile .htpasswd的服务器目录  
  2. AuthGroupFile /dev/null (需要授权访问的目录)  
  3. AuthName EnterPassword  
  4. AuthType Basic (授权类型)  
  5. require user wsabstract (允许访问的用户,如果希望表中所有用户都允许,可以使用 require valid-user)   


注,括号部分为学习 时候自己添加的注释


来自 http://justcoding.iteye.com/blog/547364

 

apache的Rewrite介绍和一些实例讲解
2013-07-24 10:37:54   来源:   评论:0 点击:

    最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据。http post请求的url格式为:
http://demo-domain/myuri?param1=p1&param2=p2。由于myuri非php文件,故要借助Apache的rewrite功能将其“引流”至php脚本,由后者实现真正的代理功能。
        Apache的Rewrite功能由扩展模块mod_rewrite.so实现,关于mode_rewrite的介绍,可以参考Apache官方文档。
        不得不说,对于不熟悉Apache的新手(比如我)来说,还是需要折腾一番的。好在最后终于搞定了,作为笔记,记录于此。
        大体来说,要使Apache实现正常的rewrite功能并实现HTTP POST请求的代理功能,需要以下2个步骤。
1. 启用Apache的mod_rewrite扩展
         默认情况下,Apache的扩展模块中是包含mod_rewrite.so的,相应地,其conf/httpd.conf中也会有下面这行内容:
         #LoadModule rewrite_module modules/mod_rewrite.so
         mod_rewrite扩展默认未启用,我们只需将#注释符去掉,启用该扩展模块即可。
2. 开启RewriteEngine并配置RewriteRule
         在httpd.conf文件最后部分添加下面2行内容:
           RewriteEngine ON
           RewriteRule ^/myuri.*$ /myproxy.php
         这样就将url的方法名为myuri的http请求rewrite至myproxy.php脚本,由后者实现http proxy功能。
         需要注意的几点:
         1)由于我的业务需求是在服务器级做rewrite,故只需修改httpd.conf相关配置项,无需修改<Directory /> section中的AllowOverride配置,如果要用.htaccess文件实现目录级的局部rewrtie,则为保证rewrite功能正常使用,需要设置AllowOverride选项。
         关于AllowOverwrite的说明,可参考官网文档。关于何时需要利用.htaccess实现rewrite,这篇文章有解释,此处不再赘述。
         2)配置RewrtieRule时,这篇文章提到想要实现POST数据的rewrite,必须设置P Flag,表示force proxy。但我的测试结果表明,不设置P时http post的rewrite可以正常work,相反,如果设置了P flag(在RewriteRule行尾明确指定RewriteRule flag为[P]),则需要下面的第三步设置才能正常实现post的rewrite。囧。。。
         3)关于RewriteRule众多flags的含义,可参考这里。
        经过上面2步,重启Apache后,rewrite功能就可以使用了,测试表明HTTP GET/POST请求的rewrite正常,符合预期。
        不过若在RewriteRule中指定[P],则post方式的rewrite还需要启用Apache的proxy扩展,如本文第3步所述。
3. 启用Apache的proxy扩展(是否需要该步设置视RewriteRule是否指定P flag而定)
         在httpd.conf中启用下面2个扩展模块以实现http post的proxy功能(默认未启用,去掉#注释启用即可):
             LoadModule proxy_module modules/mod_proxy.so
             LoadModule proxy_http_module modules/mod_proxy_http.so
         注:经测试,上面两个扩展缺一不可



==================================================


实例讲解:

要求:文件名中含有hzw时,跳转到err.htm,即hzw.php hzw.htm hzw11.htm等,只要文件名中含有hzw就跳转
Rewrite规则设置如下:
RewriteEngine ON
RewriteCond %{REQUEST_FILENAME}   hzw
RewriteRule .*$    err.htm [NC,R]

讲解:
RewriteCond这一行中%{REQUEST_FILENAME}表示文件名变量,右边的hzw表示匹配值,如果能匹配,就往下执行
RewriteRule这一行, .*$是一个正则表达式语法,表示任何的网址,星号符旁边的$表示未尾匹配,NC表示不区分大小写,R表示外部跳转,即浏览器上面的URL会变化,即符合RewriteCond匹配时,无论是任何网址,都跳转到err.htm


要求:在rewrite中有一些系统变量,如何查看这些变量
解决方法如下:
RewriteEngine ON
RewriteRule .*?/hzw\.htm err.htm?%{HTTP_USER_AGENT}  [NC,R]
讲解:即在跳转的时候,在URL后台加上系统变量即可



==================================================
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>

 

普通分类: