/ 中存储网

Apache如何配置rewrite规则

2013-09-26 21:35:01 来源:kejihao
一般第一行 开启重写引擎

RewriteEngine on

任何mod_rewrite代码之前都要加上RewriteEngine on这个状态,

RewriteEngine off 与RewriteEngine on之间的规则将不起作用

RewriteRule指令:

RewriteRule  重写后的模式字符串  重写前的字符串

例如 从写前的字符串 test.php?categ=15&id=12 要重写成 test/15/12

RewriteRule  ^/?test/([0-9]+)/([0-9]+)$  test.php?categ=$1&id=$2

其中 /? 是为了兼容以前版本的apache  一代Apache要求{REQUEST_URI}有斜杠而二代Apache却不允许

这样 当url中 有 test/15/12 形式的字符串时 就会被转化为 test.php?categ=15&id=12

如果.htaccess文件在根目录 那么模式字符串就从域名后面开始匹配,如果是在根目录下某个文件夹比如(site1) 那么就从 http://localhost/site1/ 后面开始匹配。

RewriteCond 指令

重写条件 判断url是否符合规则 符合规则的url将被重写

RewriteCond %{HTTP_HOST}  !^www.mycom.com$ [NC]

RewriteRule ^(.*)$  http://www.mycom.com%{REQUEST_URI} [R=301,L]

上面两句代表 如果url中host名称 不是www.mycom.com 就将其重写为 http://www.mycom.com%{REQUEST_URI}

其中%{HTTP_HOST} 是一个Apache服务器变量 代表主机 %{REQUEST_URI} 为查询字符串。[NC] 代表忽略大小写 R=301 永久重定向

例如 防止图片盗链

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www.)?mycom.com/ [NC]

RewriteRule .(gif|jpg|png)$ - [F]

如果{HTTP_REFERER}值不为空,或者不是来自你自己的域名,这个规则用[F]FLAG阻止以gif|jpg|png 结尾的URL

你还可以改变图片,让访问盗链网站的用户知道该网站正在盗用你的图片。

替换成其他图片

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www.)?mycom.com/ [NC]

RewriteCond %{REQUEST_URI} !downloadad1.gif$ [NC]

RewriteRule .(gif|png|jpg|png)$ http://www.mycom.com/downloadad1.gif [R,L]

上面加了一个条件,让其可以访问替换后的图片

如果你的主机没有提供404页面重定向服务,那么我们自己创建。

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .? /404.php [L]

这里-f匹配的是存在的文件名,-d匹配的存在的路径名。这段代码在进行404重定向之前,会判断你的文件名以及路径名是否存在。你还可以在404页面上加一个?url=$1参数:

RewriteRule ^/?(.*)$ /404.php?url=$1 [L]9

这样,你的404页面就可以做一些其他的事情,例如默认信息,发一个邮件提醒,加一个搜索,等等。

另外还可以通过 http.conf 中

ErrorDocument 404 /404.html 来实现

其中apache变量就是php中$_SERVER 数组中的一部分

例如{HTTP_USER_AGENT} 就是php中的$_SERVER['HTTP_USER_AGENT']  {SERVER_PORT} => $_SERVER['SERVER_PORT']

FLAGS属性

mod_rewrite用”FLAGS”来建立重写条件以及其他属性。我们用中括弧将FLAGS包起来,放在条件或者是规则的末尾,用逗号将多个FLAGS分隔。以下列表是你需要熟悉的几个主要FLAGS:

last|L -[L]告诉Apache服务器一系列的条件或者是规则将在它出现后结束,换句话说就是[L]不出现,mod_rewrite将会一直执行。

nocase|NC -[NC]告诉Apache服务器忽略正则中的大小写,它经常被用到{HTTP_HOST}服务器参数上,因为域名里面是不会区分大小写的。

redirect|R -[R] 经常引用到触发可见的定向。默认情况下它是一个HTTP 302的临时重定向,但是你可以注明具体的HTTP 代码,比如你可以用[R=301]来表明这是一个永久重定向,这对搜索引擎抓取你重定向后的网页相当有用。

qsappend|QSA -[QSA] 用于添加新的查询参数。你可以在原查询参数后面定义新的查询参数,但命名时注意不要重复已存在的参数名。错误的引用[QSA]将会破坏原来的查询参数导致重定向错误。

forbidden|F -[F]告诉Apache响应请求时不提供页面。其原理就是Apache会发出一个403 HTTP相应,可以保护网站不被未经授权的或者其他盗链访问。

ornext|OR -[OR] 作为默认值[AND]的反义词,可以通过逻辑关系将一系列重写条件组合起来。

next|N -[N]可以让你的重写条件循环匹配,当你不知道{REQUEST_URI}有多少字符进行匹配的时候很有用。