![](https://i-blog.csdnimg.cn/blog_migrate/55ab620f5871e53bef07f70ce8b1e644.bmp)
在确保地址正确的情况下,不能下载相应的资源,均是受到防盗链系统的影响,那么究竟什么是防盗链系统呢?防盗链自然就是防范盗链,所以这里先说一下什么是盗链。
现在大家应该知道了为什么有真实地址仍然不能下载,这就是防盗链的作用。凡事必有因果,为什么可以防盗链呢,其实现原理是什么?防盗链又是如何实现的呢?
尽管防盗链技术越来越成熟,破解相对来说难度较大,但在了解原理之后,大多都可以针对其防范的原理入手进行破解。
![](https://i-blog.csdnimg.cn/blog_migrate/acc44d920dc2d1dc5ef24681bffde30f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/6e290990e46fac198d83d9d31fa9fca4.jpeg)
无论是对于搜索引擎还是对于访客而言,很多网站程序生成的URL并不友好,所以需要将URL以更简短的方式来重写。这种技术可以解决很多常见的问题,如:页面伪静态,域名重定向等。URL重写并非只有Apache的rewrite模块能做到,ISAPI也可以实现。但ISAPI只能用于Wndows,国内很多虚拟空间都只支持ISAPI2,功能较弱。rewrite模块的强大在于,他可以用正则来实时重写URL请求,一个规则可以拥有很多子规则、附加条件。
下图是有一条重写条件的重写规则,可以看出Rewrite最基本的格式:重写条件(RewriteCond)是字符串在前,正则在后;重写规则(RewriteRule)是正则在前,字符串在后。本文将从几个简单例子出发,说明一些常用的Rewrite的语法,并解决具体的问题。
EXAMPLE 1
- RewriteEngine on:开启Rewrite
- RewriteCond $1 !(index\.php|images):如果文件不为index.php或目录不为images。
- RewriteRule ^(.*)$ /index.php?page=$1:转给index.php处理。
$1代表引用RewriteRule中的第一个正则(.*)代表的字符。RewriteCond中的正则很普通,所以不做说明。RewriteRule中的正则,(.*)代表任意字符,^是开始锚,$是结束锚。
设置之后,当访问dmyz.org/about时,实际是访问dmyz.org/index.php?page=about,从url中省略掉了index.php。这一规则经常用于框架开发环境,因为大多数框架都是将所有的请求提交给一个入口文件(通常是index.php)来处理的。
将第三行修改:
访问dmyz.org/about.htm时实际访问的仍然是dmyz.org/index.php?page=about,这就实现简单的伪静态了。
EXAMPLE 2
用这个简单的例子来说明重写条件(RewriteCond)使用的服务器变量和特殊正则。
%{REQUEST_FILENAME}获得一个服务器变量的值,!-f是正则,其中感叹号表否定,-f用来检测当前值所代表的路径是否是一个常规文件。因此例2实现的是:当访问的文件不是一个常规文件时,转到404.htm页面。这就是一个简单的用Rewrite实现404页面重定向的例子。还可以补充一下,将其修改为:
服务器变量有很多,常用的如下表:
服务器变量 用途 参考 %{HTTP_USER_AGENT} 访客的浏览器类型 Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 GTB7.1
%{HTTP_REFERER} 访问的链接地址 http://dmyz.org/archives/99 %{HTTP_FORWARDED} 通过HTTP获得地址,通常是访客的IP地址,但HTTP头可以修改,所以如果要判断访客的IP,推荐使用%{REMOTE_ADDR} 192.168.0.1 %{HTTP_HOST} 访问的域名 http://dmyz.org %{SERVER_ADDR} 服务器的IP地址 127.0.0.1 %{REMOTE_ADDR} 访客IP地址 192.168.0.1 %{REMOTE_USER} 只在HTTP验证中有用,保存验证时使用的用户名 admin %{REQUEST_METHOD} 提交查询的方式 GET或是POST %{SCRIPT_FILENAME} 所访问的文件的绝对路径 /var/www/dmyz.org/htdocs/index.php %{QUERY_STRING} 查询字符串,包含查询变量名和参数 page=1&name=dmyz %{TIME_YEAR}/%{TIME_MON}/%{TIME_DAY} 获取年/月/日 2010/09/30 EXAMPLE 3
本例中使用了配置指令,和重写规则对重写条件的引用。
如例2所说,重写条件可以使用服务器变量和特殊正则,但重写规则不可以。所以需要在重写规则中反向引用重写条件的内容。例3中使用%1来反向引用(.*)?。当查询字符串为pageid=任意字符串时,跳转到thread.php?fid=任意字符串。这条正则很适合网站搬家、更换程序后,将原地址转向到新地址。
前两个例子,重写条件和重写规则都只有两个参数——正则和字符串,本例中追加第三个参数,它被称为标识,跟在重写条件和重写规则之后的,作为辅助、补充之用。本例中使用了最简单三个标识:
- [NC]:忽略大小写。
- [L]:结尾标识。停止重写操作,并不再应用其他重写规则。防止本条规则被后续规则影响。
- [R=301]:利用HTTP 301跳转。
还有其他很有用的标识,可以参考Apache手册。
附:最近遇到的几个问题,虽然使用了.htaccess文件,但并未使用rewrite,一并写在这里。设置了Expires headers,关闭了Etag,开启了Wordpress的Gzip压缩。设置之后本站Yslow等级为A。
123456789101112131415161718192021# BEGIN WordPressRewriteEngine OnRewriteBase /RewriteRule ^ index \ .php $ - [ L ]RewriteCond % { REQUEST_FILENAME } ! - fRewriteCond % { REQUEST_FILENAME } ! - dRewriteRule . / index .php [ L ]# END WordPress# BEGIN GzipSetOutputFilter DEFLATEAddOutputFilterByType DEFLATE text / html text / css image / gif image / jpeg image / png application / x - javascript# END Gzip# BEGIN EtagFileETag none# END Etag# BEGIN Expires headersHeader set Expires "Thu, 15 Oct 2010 20:00:00 GMT"# END Expires headers