作者: lesca
目录 Table of Contents
一、准备开始:mod_rewrite实现所有这些神奇功能的模块叫做mod_rewrite,请确保你的服务器安装并启用了该模块: sudo a2enmod rewrite 我们一般会把所有涉及URL重写或者重定向的代码这样放置: <IfModule mod_rewrite.c> # Turn on rewrite engine Options +FollowSymlinks RewriteEngine on # More rules below ... </IfModule> 一些我们需要注意的地方:
下面我们开始讲解一些例子。 二、利用.htaccess实现URL重写(rewrite)与URL重定向(redirect)1.将.htm页面映射到.phpOptions +FollowSymlinks RewriteEngine on RewriteRule ^(.*)\.htm$ $1.php [NC] 注意事项:
2.临时重定向(R=302)与永久重定向(R=301)RewriteEngine on RewriteBase / RewriteRule ^(.*)\.htm$ $1.php [R,NC,L] 注意事项:
在讨论R=302临时重定向后,理解R=301永久重定向也就容易多了: RewriteEngine on RewriteRule ^(.*)$ http:///$1 [R=301,NC,L]
3.为什么要用重定向?——重定向和URL重写的区别
4.长短地址转换利用URL重写,我们可以很方便地实现长短地址的转换,但是用重定向就不合适了。 RewriteEngine On RewriteRule ^grab /public/files/download/download.php 若访问 5.去掉wwwOptions +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L] 6.加上wwwRewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)$ RewriteRule (.*) http://www\.%1/$1 [R=301,L] 7.支持多域名访问如果你不凑巧买到了不支持多域名的主机,那么.htaccess或许可以帮助你。现在假设你有域名domain-one.com和domain-two.com,并且在服务器根目录有对应文件夹one和two,那么通过下面的改写就能让Apache同时接受者两个域名的请求: #two domains served from one root.. RewriteCond %{HTTP_HOST} domain-one.com RewriteCond %{REQUEST_URI} !^/one RewriteRule ^(.*)$ /one/$1 [L] RewriteCond %{HTTP_HOST} domain-two.com RewriteCond %{REQUEST_URI} !^/two RewriteRule ^(.*)$ /two/$1 [L] 三、改写查询字符串QUERY_STRING查询字符串是指URL请求中“问号”后面的部分。比如,http://mysite/grab?foo=bar中粗体部分就是查询字符串,其中变量名是foo,值是bar。 1.利用QSA转换查询字符串QUERY_STRINGQSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的: RewriteEngine On RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
通过QSA,我们可以将简单链接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link RewriteEngine On RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA] 2.利用RewriteCond改写查询字符串QUERY_STRINGRewriteEngine On RewriteCond %{QUERY_STRING} foo=(.*) RewriteRule ^grab(.*) /page.php?bar=%1
3.QSA与RewriteCond双剑齐发RewriteEngine On RewriteCond %{QUERY_STRING} foo=(.+) RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
4.剥离查询字符串只需在要开始剥离的链接后面加个“问号”,并且不要启用QSA标志,就可剥离查询字符串 RewriteEngine On # Whatever QS is RewriteCond %{QUERY_STRING} . # I don't want it with Question mark RewriteRule foo.php(.*) /foo.php? [L] 四、利用RewriteCond和RewriteRule进行访问控制我们在第一篇.htaccess基础中提到了很多有用的访问控制方法,其实通过Rewrite也能实现类似的功能,而且可以更强大! 1.文件访问控制之前利用Order、Files及FilesMatch命令实现的访问控制可以满足大部分要求,但是当用户被拒绝时,他们看到的是硕大的“403 Forbidden”,如果你不想伤害用户的感情,就需要显示一些别的东西,通过Rewrite就可以实现这个特性: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$ RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$ RewriteCond %{REQUEST_FILENAME} !special.zip$ RewriteRule ^(.+)$ /chat/ [NC]
2.用.htaccess阻止User-agent什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是所有HTTP客户端都得用User-agent向服务器“自报家门”,以便服务器对不同的客户端作出不同响应。比如,某站点可能需要对浏览器、搜索引擎crawl还有各类下载工具作出不同的响应。服务器就是通过所谓的User-agent进行区分的。 RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC] RewriteRule . abuse.txt [L]
通常,我们不会仅限制一个UA。利用[OR]即可实现对多个UA作出统一处理: RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR] # etc.. RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC] RewriteRule . abuse.txt [L] 3.用.htaccess阻止盗链(hot-linking)盗链,特别是图片,是非常可耻的!哪怕将图片复制到自己服务器上,也比盗用他人的图片链接来得光彩!(吐糟完毕) RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?lesca\.me/ [NC] RewriteCond %{REQUEST_URI} !hotlink\.png [NC] RewriteRule .*\.(gif|jpg|png)$ /hotlink.png [NC] 简单解释一下该规则的功能:
References:[1] more .htaccess tips and tricks.. |
|