URL重定向是.htaccess的重头戏,它能够将长地址转为短地址、将动态地址转为静态地址、重定向丢失的页面、防止盗链、实现自动语言转换等。笔者以为难点是在正则表达式的运用和理解上。有关htaccess的正则表达式用法,请查阅本站《.htaccess正则表达式》一文。 php
实现全部这些神奇功能的模块叫作mod_rewrite,请确保你的服务器安装并启用了该模块: css
sudo a2enmod rewrite
咱们通常会把全部涉及URL重写或者重定向的代码这样放置: html
<IfModule mod_rewrite.c> # Turn on rewrite engine Options +FollowSymlinks RewriteEngine on # More rules below ... </IfModule>
一些咱们须要注意的地方: 正则表达式
下面咱们开始讲解一些例子。 数组
Options +FollowSymlinks RewriteEngine on RewriteRule ^(.*)\.htm$ $1.php [NC]
注意事项: 浏览器
RewriteEngine on RewriteBase / RewriteRule ^(.*)\.htm$ $1.php [R,NC,L]
注意事项: 安全
在讨论R=302临时重定向后,理解R=301永久重定向也就容易多了: 服务器
RewriteEngine on RewriteRule ^(.*)$ http://newdomain.com/$1 [R=301,NC,L]
利用URL重写,咱们能够很方便地实现长短地址的转换,可是用重定向就不合适了。 网络
RewriteEngine On RewriteRule ^grab /public/files/download/download.php
若访问 app
http://mysite/grab?file=my.zip
则会执行该页面:
http://mysite/public/files/download/download.php?file=my.zip
Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)$ RewriteRule (.*) http://www\.%1/$1 [R=301,L]
若是你不凑巧买到了不支持多域名的主机,那么.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]
查询字符串是指URL请求中“问号”后面的部分。好比,http://mysite/grab?foo=bar中粗体部分就是查询字符串,其中变量名是foo,值是bar。
QSA标志( 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]
RewriteEngine On
RewriteCond %{QUERY_STRING} foo=(.*)
RewriteRule ^grab(.*) /page.php?bar=%1
RewriteEngine On RewriteCond %{QUERY_STRING} foo=(.+) RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
只需在要开始剥离的连接后面加个“问号”,而且不要启用QSA标志,就可剥离查询字符串
RewriteEngine On # Whatever QS is RewriteCond %{QUERY_STRING} . # I don't want it with Question mark RewriteRule foo.php(.*) /foo.php? [L]4、利用RewriteCond和RewriteRule进行访问控制
咱们在第一篇.htaccess基础中提到了不少有用的访问控制方法,其实经过Rewrite也能实现相似的功能,并且能够更强大!
以前利用Order、Files及FilesMatch命令实现的访问控制能够知足大部分要求,可是当用户被拒绝时,他们看到的是硕大的“403 Forbidden”,若是你不想伤害用户的感情,就须要显示一些别的东西,经过Rewrite就能够实现这个特性:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$ RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$ RewriteCond %{REQUEST_FILENAME} !special.zip$ RewriteRule ^(.+)$ /chat/ [NC]
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !([^/]+)\.css$ RewriteCond %{REQUEST_FILENAME} !([^/]+)\.js$ RewriteRule ^(.+)$ /chat/ [NC]
什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是全部HTTP客户端都得用User-agent向服务器 “自报家门”,以便服务器对不一样的客户端做出不一样响应。好比,某站点可能须要对浏览器、搜索引擎crawl还有各种下载工具做出不一样的响应。服务器就是通 过所谓的User-agent进行区分的。
若是你的服务器提供某些资源的下载,那么你就必须多加当心诸如“迅雷”等下载软件,由于它们可能把你网站资源吸干,而且影响你的正常访客访问。为此,咱们能够利用Rewrite限制某些UA的访问:
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]
盗链,特别是图片,是很是可耻的!哪怕将图片复制到本身服务器上,也比盗用他人的图片连接来得光彩!(吐糟完毕)
.htaccess的Rewrite功能能够提供很是简单、有效的方法阻止这种可耻行为:
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]
简单解释一下该规则的功能: