.htaccess语法,伪静态中的RewriteCond和RewriteRule使用说明

关于伪静态.htaccess的语法看了一次没有搞懂,晚上没什么事情研究了一下,大概如下:

1、.htaccess 语法简介

RewriteEngine ON

RewriteCond %{HTTP_HOST} ^abc.com$ [OR]

RewriteCond %{REQUEST_URI} ^/$

RewriteRule ^(.*)$ http://www.59693.com/ [R=301,L]

RewriteEngine on

RewriteCond %{ HTTP_HOST } ^59693.com
RewriteRule ^(.*)$ http://59693.com/hot$1 [R=301,L]

RewriteCond %{ HTTP_HOST } ^www.59693.com
RewriteRule ^(.*)$ http://www.59693.com/hot$1 [R=301,L]

1.1、 RewriteCond的语法如下:

RewriteCond TestString CondPattern [Flags]

其中的TestString是指一个文本格式的条件,例子中用的是环境变量名HTTP_HOST所包含的内容(Name= Value),这是一个map(键值对)格式的数据类型。

CondPattern是条件参数,这儿以第一个例子为例,就是abc.com。

Flags标识是是第三个参数,可以用来紧跟下一个条件,这儿用OR表示或者,如果没有[Flags],则用隐含的AND,表示并且。其它的还可以NC等等,表示忽略大小写

RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.*
RewriteRule index.php index.m.php
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule index.php index.L.php
RewriteRule index.php index.b.php

上 面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的 时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句(依PHP语句为例):

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0'){
    //跳转到对index.m.php的访问
}else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx’){
    //跳转到对index.L.php的访问
}else
//跳转到对index.b.php的访问

再看例2:

RewriteCond %{HTTP_REFERER} (www.test.cn)

RewriteRule (.*)$ test.php

上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

再看例三:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule (.*)$ test.php

上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。

下面是自己收藏的一些有用的重写规则:

RewriteCond %{REQUEST_FILENAME} !-f //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteCond %{REQUEST_FILENAME} !-d //#如果目录存在就直接访问目录不进行RewriteRule
RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite

1.2、RewriteRule的语法如下:

RewriteRule Pattern Substitution [Flags]

其中的Pattern就是参数,一般为一些文件的扩展名,Substitution是用来替换前面用的,这儿的Flags,常用的R表示redirect(强制重定向),F表示forbidden(禁止访问),L表示last(最后),通常当你希望停止重写操作而立即重定向时,可用它。

1.3、.htaccess 用到的正则表达式

元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。

^匹配你要用来查找的字符串的开头

$匹配结尾。

比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。

\b代表着单词的开头或结尾,也就是单词的分界处,它只匹配一个位置。

\d是个新的元字符,匹配一位数字(0,或1,或2,或……)。

例:0\d{2}-\d{8} 匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码。当然,这个例子只能匹配区号为3位的情形)。

\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。

\w匹配字母或数字或下划线或汉字

\来取消字符的特殊意义。可使用\.和\*。要查找\本身,也得用\\.

[ ] 匹配没有预定义元字符的字符集合,在方括号里列出它们就行了

例: [aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)

[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w

.匹配除 “\n” 之外的任何单个字符。要匹配包括 '\n’ 在内的任何字符,请使用象 '[.\n]' 的模式。

例子:\(?0\d{2}[) -]?\d{8}。

像(010)88886666,或022-22334455,02912345678等。

分析:首先是一个转义字符\(,它能出现0次或1次(?),

然后是一个0,后面跟着2个数字(\d{2}),

然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

1.4 .htaccess放置参考wordpress的伪静态写法

# BEGIN WordPress

RewriteEngine On
RewriteBase /

RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

——————————邪恶的分割线1————————————————————-

在 Windows 资源管理器里面不允许你建立 .htaccess 这样只有扩展名的文件。

用记事本编写好内容后,保存时,文件名要输入为 “.htaccess”

或者先将文件保存为其他名字,例如 app.htaccess。

然后进入命令行窗口(通过开始菜单运行 cmd.exe 程序即可),

输入 ren app.htaccess .htaccess 命令来对文件改名。

——————————邪恶的分割线2————————————————————-

常见的.htaccess应用举例

防止盗链,如果来得要访问jpe jpg bmp png结尾的url 用户不是来自我们的网站,那么让他看一张我们网站的展示图片。

RewriteEngine OnRewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]RewriteCond %{HTTP_REFERER} !^$RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

网站升级的时候,只有特定IP才能访问,其他的用户将看到一个升级页面

RewriteEngine onRewriteCond %{REQUEST_URI} !/upgrade.html$RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30

RewriteRule $ http://www.59693.com/upgrade.html [R=302,L]

把老的域名转向新域名

# redirect from old domain to new domainRewriteEngine OnRewriteRule ^(.*)$http://www.yourdomain.com/$1[R=301,L]

RewriteEngine On

RewriteRule index.html index.php

比如:http://www.59693.com/index.html -> http://www.59693.com/index.php

RewriteRule ^test([0-9]*).html$ test.php?id=$1

比如:http://www.59693.com/test8.html -> http://www.59693.com/test.php?id=8

RewriteRule ^cat-([0-9]+)-([0-9]+)\.html$ cat.php?id1=$1&id2=$2

比如:http://www.59693.com/cat-1-3.html -> http://www.59693.com/cat.php?id1=1&id2=3

RewriteRule ^cat-([a-zA-Z0-9\-]*)-([0-9]+)-([0-9]+)\.html$ cat.php?id0=$1&id1=$2&id2=$3

比如:http://www.59693.com/cat-zbc2ac-3-5.html -> http://www.59693.com/cat.php?id0=zbc2ac&id1=3&id2=5

RewriteRule ^cat1-([0-9]+)-([0-9]+)-([0-9]+)\.html$ cat1.php?id1=$1&id2=$2&id3=$3

比如:http://www.59693.com/cat1-4-3-8.html -> http://www.59693.com/cat1.php?id1=4&id2=3&id3=8

RewriteRule ^cat([0-9]*)/$ cat.php?id1=$1

比如:http://www.59693.com/cat5/ -> http://www.59693.com/cat.php?id1=5

RewriteRule ^catm([0-9]*)/([0-9]*)/$ catm.php?id1=$1&id2=$2

比如:http://www.59693.com/catm6/3/ -> http://www.59693.com/catm.php?id1=6&id2=3

更多例子:

1. 使用.htaccess 创建自定义的出错页面。对于Linux Apache来说这是一项极其简单的事情。使用下面的.htaccess语法你可以轻松的完成这一功能。(把.htaccess放在你的网站根目录下)

ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php

2. 设置网站的时区

SetEnv TZ America/Houston

3. 阻止IP列表

有些时候,你需要以IP地址的方式阻止一些访问。无论是对于一个IP地址还是一个网段,这都是一件非常简单的事情,如下所示:

allow from all
deny from 145.186.14.122
deny from 124.15

Apache对于被拒绝的IP会返回403错误。

4. 把一些老的链接转到新的链接上——搜索引擎优化SEO

Redirect 301 /d/file.html http://www.htaccesselite.com/r/file.html

5. 为服务器管理员设置电子邮件。

ServerSignature EMail
SetEnv SERVER_ADMINdefault@domain.com

6. 使用.htaccess 访止盗链。如果你网站上的一个图片被别的N多的网站引用了,那么,这很有可能会导致你服务器的性能下降,使用下面的代码可以保护某些热门的链接不被过多的引用。

Options +FollowSymlinks

# Protect Hotlinking
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?59693.com/[nc]
RewriteRule .*.(gif|jpg|png)$http://59693.com/img/hotlink_f_o.png[nc]

7. 阻止 User Agent 的所有请求

## .htaccess Code :: BEGIN
## Block Bad Bots by user-Agent

SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
SetEnvIfNoCase user-Agent ^Zeus [NC]

Order Allow,Deny
Allow from all
Deny from env=bad_bot

## .htaccess Code :: END

8. 把某些特殊的IP地址的请求重定向到别的站点

ErrorDocument 403 http://www.youdomain.com
Order deny,allow
Deny from all
Allow from 124.34.48.165
Allow from 102.54.68.123

9. 直接找开文件而不是下载– 通常,我们打开网上文件的时候总是会出现一个对话框问我们是下载还是直接打开,使用下面的设置就不会出现这个问题了,直接打开。

AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .mov

10. 修改文件类型– 下面的示例可以让任何的文件都成为PHP那么被服务器解释。比如:myphp, cgi,phtml等。

ForceType application/x-httpd-php
SetHandler application/x-httpd-php

11. 阻止存取.htaccess 文件

# secure htaccess file
order allow,deny
deny from all

12. 保护服务器上的文件被存取

# prevent access of a certain fileorder allow,deny
deny from all

13. 阻止目录浏览

# disable directory browsing
Options All -Indexes

14. 设置默认主页

# serve alternate default index page
DirectoryIndex about.html

发表评论