.htaccess 语法以及应用

【转】 php

http://blog.sina.com.cn/s/blog_6e8b46e701014drc.html   html

http://blog.sina.com.cn/s/blog_6e8b46e701014dtu.html正则表达式

   

.htaccess是Apache服务器的一个很是强大的分布式配置文件。 正确的理解和使用.htaccess文件,能够帮助咱们优化本身的服务器或者虚拟主机。apache

如何启用htaccess 以windows为例,进入apache/conf目录,找到httpd.conf文件,去掉 LoadModule rewrite_module modules/mod_rewrite.so 前面的#,而后设置目录属性AllowOverride All,重启apache便可windows

常见格式api

下面是一个典型的htaccess文件浏览器

# 开启URL重写
RewriteEngine on
# URL重写的做用域
# RewriteBase /path/to/url
# 知足怎样的条件
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]安全

# 应用怎样的规则
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]服务器

来看看RewriteCond,首先有一个%,由于{HTTP_HOST}是一个apache变量,须要用%来指示。从!开始就是匹配的条件,支持 正则。!表示不等于,这句话的意思就是:若是HTTP_HOST不是www.example.com。后面的[NC](no case)表示忽略大小写,常见的还有cookie

  • [L](last):终止一系列的RewriteCond和RewriteRule
  • [R](redirect):触发一个显示的跳转,也能够指定跳转类型,如[R=301]
  • [F](forbidden):禁止查看特定文件,apache会触发403错误

典型应用

图片防盗链

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC]
RewriteRule \.(gif|jpg|png)$ - [F]

因为是基于HTTP_REFERER的验证,因此只能防止通常的图片盗链,由于HTTP_REFERER是比较容易伪造的

自定义404错误页面
若是用户输入了一个不存在的url,那么就显示自定义的错误页面

ErrorDocument 404 /404.html
# 其余同理
ErrorDocument 500 /500.html

处理移动过的文件

Redirect 301 /old.html http://yoursite.com/new.html
# 也能够是下面这样
RewriteRule /old.html http://yoursite.com/new.html [R=301,L]
# 若是想隐式跳转(URL地址不变,但实际上内容是其余URL的),就使用下面的
RewriteRule /old.html http://yoursite.com/new.html [L]

对于RewriteRule还有好多文章能够作,好比

# 把html后缀的url连接到php文件
# $1指代的是前面第1个用括号括起来的内容
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]
# 或者把旧文件夹的内容连接到新文件夹
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]
# 隐藏文件名
RewriteRule ^/?([a-z]+)$ $1.php [L]禁止显示目录列表

若是目录里没有index文件,又没有对该目录作过特别的处理,尤为是windows主机,那么该目录里的内容就会显示出来,这时能够在根目录建立 一个.htaccess文件,而后写上

Options -Indexes
# 就这么一句就搞定了

阻止/容许特定IP/IP段

# 禁止全部IP,除了指定的
order deny,allow
deny from all
# 若是想容许IP段,如123.123.123.0 ~ 123.123.123.255,则
# allow from 123.123.123.
allow from 123.123.123.123
 
ErrorDocument 403 /page.html
 

allow from all

 
#若是想禁止特定IP
deny from 123.123.123.123

添加MIME类型

AddType video/x-flv .flv
# 若是设置类型为 application/octet-stream 将提示下载
AddType application/octet-stream .pdf

 

上文htaccess语法详细解释与用例分析中对RewriteCond和RewriteRule的用法进行了举例分析,本文将详细描述上述两个命令的使用格式,与所使用的变量和规则。这篇文章很长啊哈,请认真阅读,内容都颇有用哦。

RewriteCond指令格式

【说明】定义重写发生的条件
【语法】RewriteCond TestString CondPattern [flags]

RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当RewriteCond的条件(CondPattern)匹配成功时,RewriteRule的重写规则才被应用于当前URL处理。

TestString是一个纯文本的字符串,除了包含普通的字符外,还能够包括下列的变量结构扩展:

RewriteMap扩展:引用方法是:${mapname:key|default} 细节请参见RewriteMap指令 。

TestString能够包含服务器变量 ,引用方法是:%{NAME_OF_VARIABLE}

NAME_OF_VARIABLE能够是下表列出的字符串之一:

HTTP头链接与请求 服务器自身 日期和时间 其它
HTTP_USER_AGENT DOCUMENT_ROOT TIME_YEAR API_VERSION
HTTP_REFERER SERVER_ADMIN TIME_MON THE_REQUEST
HTTP_COOKIE SERVER_NAME TIME_DAY REQUEST_URI
HTTP_FORWARDED SERVER_ADDR TIME_HOUR REQUEST_FILENAME
HTTP_HOST SERVER_PORT TIME_MIN IS_SUBREQ
HTTP_PROXY_CONNECTION SERVER_PROTOCOL TIME_SEC HTTPS
HTTP_ACCEPT SERVER_SOFTWARE TIME_WDAY  
REMOTE_ADDR   TIME  
REMOTE_HOST      
REMOTE_PORT      
REMOTE_USER      
REMOTE_IDENT      
REQUEST_METHOD      
SCRIPT_FILENAME      
PATH_INFO      
QUERY_STRING      
AUTH_TYPE      

这些变量都对应于相似命名的HTTP MIME头、Apache服务器的C变量、Unix系统中的struct tm字段,其中的大多数在其余的手册或者CGI规范中都有说明。 其中有mod_rewrite所特有的变量以下:

IS_SUBREQ

若是正在处理的请求是一个子请求,它将包含字符串”true”,不然就是”false”。 模块为了解析URI中的附加文件,可能会产生子请求。

API_VERSION

这是正在使用中的Apache模块API(服务 器和模块之间内部接口)的版本, 其定义位于include/ap_mmn.h中。 此模块API版本对应于正在使用的Apache的版本(好比在Apache 1.3.14的发行版中这个值是19990320:10)。 一般,对它感兴趣的是模块的开发者。

THE_REQUEST

这是由浏览器发送的完整的HTTP请求行(好比:”GET /index.html HTTP/1.1″)。 它不包含任何浏览器发送的其它头信息。

REQUEST_URI

这是在HTTP请求行中所请求的资源(好比上述例子中的”/index.html”)。

REQUEST_FILENAME

这是与请求相匹配的完整的本地文件系统的文件路径名。

HTTPS

若是链接使用了SSL/TLS,它将包含字符串”on”,不然就是”off”(不管mod_ssl 是否已经加载,该变量均可以安全的使用)。

其它注意事项:

SCRIPT_FILENAME和 REQUEST_FILENAME包含的值是相同的——即Apache服务器内部的request_rec结构中的 filename字段。 第一个就是你们都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。

  1. 特殊形式:%{ENV:variable} ,其中的variable能够是任意环境变量。 它是经过查找Apache内部结构或者(若是没找到的话)由Apache服务器进程经过getenv()获得的。
  2. 特殊形式:%{SSL:variable} ,其中的variable能够是一个SSL环境变量 的名字,不管mod_ssl 模块是否已经加载均可以使用(未加载时为空字符串)。 好比:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。
  3. 特殊形式:%{HTTP:header} ,其中的header能够是任意HTTP MIME头的名称。 它老是能够经过查找HTTP请求而获得。 好比:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。
  4. 预设形式:%{LA-U:variable} ,variable的最终值在执行一个内部(基于URL的)子请求后肯定。 当须要使用一个目前未知可是会在以后的过程当中设置的变量的时候,就可使用这个方法。 例如,须要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写, 就必须使用%{LA-U:REMOTE_USER}。 由于此变量是由URL重写(mod??_rewrite)步骤以后的认证步骤设置的。 可是另外一方面,由于mod_rewrite是经过API修正步骤来实现目录级(.htaccess文件)配置的, 而认证步骤先于API修正步骤,因此能够用%{REMOTE_USER}。
  5. 预设形式:%{LA-F:variable} ,variable的最终值在执行一个内部(基于文件名的)子请求后肯定。 大多数状况下和上述的LA-U是相同的。

●CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,而后再与CondPattern匹配。

注意:CondPattern是一个perl兼容的正则表达式,可是还有若干增补:

一、能够在CondPattern串的开头使用”!’(惊叹号)来指定 不匹配 。
二、CondPatterns有若干特殊的变种。 除了正则表达式的标准用法,还有下列用法:

将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 若是TestString小于CondPattern则为真。
“>CondPattern”————-(词典顺序的大于)

将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 若是TestString大于CondPattern则为真。
“=CondPattern”————-(词典顺序的等于)

将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 若是TestString等于CondPattern(两个字符串逐个字符地彻底相等)则为真。

若是CondPattern是”"—(两个双引号),则TestString将与空字符串进行比较。
“-d”————-(目录)

将TestString视为一个路径名并测试它是否为一个存在的目录。
“-f “————-(常规文件)

将TestString视为一个路径名并测试它是否为一个存在的常规文件。
“-s “————-(非空的常规文件)

将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
“-l “————-(符号链接)

将TestString视为一个路径名并测试它是否为一个存在的符号链接。
“-x “————-(可执行)

将TestString视为一个路径名并测试它是否为一个存在的、具备可执行权限的文件。 该权限由操做系统检测。
“-F “————-(对子请求存在的文件)

检查TestString是否为一个有效的文件,并且能够在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来作检查,因为会下降服务器的性能,因此请谨慎使用!
“-U “————-(对子请求存在的URL)

检查TestString是否为一个有效的URL,并且能够在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来作检查,因为会下降服务器的性能,因此请谨慎使用!
注意: 全部这些测试均可以用惊叹号做前缀(“!”)以实现测试条件的反转。

●在CondPattern以后追加特殊的标记[flags] 做为RewriteCond指令的第三个参数。flags是一个以逗号分隔的如下标记的列表:

“nocase|NC”—————(忽略大小写)

它使测试忽略大小写,扩展后的TestString和CondPattern中’AZ’ 和’a-z’是没有区别的。 此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起做用。
“ornext|OR”—————(或下一条件)

代码简写 全写 解释
R[=code]  redirect 强制外部重定向
F  forbidden 禁用URL,返回403HTTP状态码。
G  gone 强制URL为已废弃的
P  proxy 强制使用代理转发。
L  last 代表当前规则是最后一条规则,中止分析之后规则的重写。
N  next 从新从第一条规则开始运行重写过程。
C  chain 与下一条规则关联
若是规则匹配则正常处理,该标志无效,若是不匹配,那么下面全部关联的规则都跳过。
T=MIME-type  type 强制MIME类型
NS  nosubreq 只用于不是内部子请求
NC  nocase 不区分大小写
QSA  qsappend 追加请求字符串
NE  noescape 不在输出转义特殊字符
PT  passthrough 传递给下一个处理
S=num  skip 跳过num条规则
E=VAR:VAL  env 设置环境变量
CO=NAME:VAL:domain[:lifetime[:path]]  cookie 设置cookie

redirect|R [=code] (强制重定向 redirect)

以 http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution能够强制性执行一个外部重定向。 若是code没有指定,则产生一个HTTP响应代码302(临时性移动)。 若是须要使用在300-400范围内的其余响应代码,只需在此指定这个数值便可, 另外,还可使用下列符号名称之一: temp (默认的), permanent, seeother. 用它能够把规范化的URL反馈给客户端,如, 重写“/~”为 “/u/”,或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 不然,它会指向一个无效的位置! 而且要记住,此标记自己只是对URL加上 http://thishost[:thisport]/的前缀,重写操做仍然会继续。 一般,你会但愿中止重写操做而当即重定向,则还须要使用’L’标记.

forbidden|F (强制URL为被禁止的 forbidden)

强制当前URL为被禁止的,即,当即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,能够连接若干RewriteConds以有条件地阻塞某些URL。

gone|G’(强制URL为已废弃的 gone)

强制当前URL为已废弃的,即,当即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,能够标明页面已经被废弃而不存在了.

proxy|P (强制为代理 proxy)

此标记使替换成分被内部地强制为代理请求,并立 即(即, 重写规则处理当即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(好比常见的以 http://hostname开头的)可以为Apache代理模块所处理的URI。 使用这个标记,能够把某些远程成分映射到本地服务器名称空间, 从而加强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 若是你不能肯定,能够检查“httpd -l”的输出中是否有mod_proxy.c。 若是有,则mod_rewrite可使用这个功能; 若是没有,则必须启用mod_proxy并从新编译“httpd”程序。

last|L (最后一个规则 last)

当即中止重写操做,并再也不应用其余重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记能够阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它能够重写根路径的URL(’/’)为实际存在的URL, 好比, ‘/e/www/’.

next|N (从新执行 next round)

从新执行重写操做(从第一个规则从新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。 它对应于Perl中的next命令或C语言中的continue命令。 此标记能够从新开始重写操做,即, 当即回到循环的头部。
可是要当心,不要制造死循环!

chain|C (与下一个规则相连接 chained)

此标记使当前规则与下一个(其自己又能够与其后 继规则相连接的, 并能够如此反复的)规则相连接。 它产生这样一个效果: 若是一个规则被匹配,一般会继续处理其后继规则, 即,这个标记不起做用;若是规则不能被匹配, 则其后继的连接的规则会被忽略。好比,在执行一个外部重定向时, 对一个目录级规则集,你可能须要删除“.www” (此处不该该出现“.www”的)。

type|T=MIME-type(强制MIME类型 type)

强制目标文件的MIME类型为MIME-type。 好比,它能够用于模拟mod_alias中的ScriptAlias指令, 之内部地强制被映射目录中的全部文件的MIME类型为“application/x-httpd-cgi”。

nosubreq|NS (仅用于不对内部子请求进行处理 no internal sub-request)

在当前请求是一个内部子请求时,此标记强制重写 引擎跳过该重写规则。 好比,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不必定有用的,并且若是整个规则集都起做用, 它甚至可能会引起错误。因此,能够用这个标记来排除某些规则。

根据你的须要遵循如下原则: 若是你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种状况下,可使用这个标记。

nocase|NC (忽略大小写 no case)

它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。

qsappend|QSA (追加请求串 query string append)

此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 若是须要经过重写规则在请求串中增长信息,就可使用这个标记。

noescape|NE (在输出中不对URI做转义 no URI escaping)

此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 通常状况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记能够阻止这样的转义,以容许百分号等符号出如今输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE] 可使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

passthrough|PT (移交给下一个处理器 pass through)

此标记强制重写引擎将内部结构 request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其余URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子: 若是要经过mod_rewrite的重写引擎重写/abc为/def, 而后经过mod_alias使/def转变为/ghi,能够这样:

RewriteRule ^/abc(.*) /def$1 [PT]Alias /def /ghi

若是省略了PT标记,虽然mod_rewrite运做正常, 即, 做为一个使用API的URI到文件名翻译器, 它能够重写uri=/abc/…为filename=/def/…, 可是,后续的mod_alias在试图做URI到文件名的翻译时,则会失效。

注意: 若是须要混合使用不一样的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。 混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers

若是当前Apache API除了URI到文件名hook以外,还有一个文件名到文件名的hook, 就不须要这个标记了! 可是,若是没有这样一个hook,则此标记是惟一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增长这样一个hook。

skip|S=num (跳事后继的规则 skip)

此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它能够实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不一样的!)

env|E=VAR:VAL (设置环境变量 environment variable)

此标记使环境变量VAR的值为VAL, VAL能够包含可扩展的反向引用的正则表达式$N和%N。 此标记能够屡次使用以设置多个变量。 这些变量能够在其后许多状况下被间接引用,但一般是在XSSI (via ) or CGI (如 $ENV{’VAR’})中, 也能够在后继的RewriteCond指令的pattern中经过%{ENV:VAR}做引用。 使用它能够从URL中剥离并记住一些信息。

cookie|CO=NAME:VAL:domain[:lifetime[:path]] (设置cookie)

它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,好比’.apache.org’, 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。

●举例说明RewriteCond命令规则

RewriteCond %{REMOTE_HOST} ^andelse.com [OR]
RewriteCond %{REMOTE_HOST} ^*.andelse.com
RewriteRule …针对这2个主机的规则集

RewriteCond % { HTTP_USER_AGENT }  ^Mozilla.*
RewriteRule ^/$ /homepage. max .html  [ L ]
若是你使用的浏览器识别标志是’Mozilla’,则你将获得内容最大化的主页homepage. max .html(含有Frames等等)。

RewriteRule指令格式

【说明】定义重写的规则
【语法】RewriteRule Pattern rewritePattern [flags]

RewriteRule指令,能够定义一条重写 规则,规则间的顺序很是重要。对Apache1.2及之后的版本,模板(Pattern)是一个POSIX正则式,用以匹配当前的URL。当前的URL不 必定是最初提交的URL,由于可能用一些规则在此规则前已经对URL进行了处理。rewritePattern 大多数文章写为Substitution ,这里为了更清楚的认识故写为rewritePattern 。

●Pattern 可使用以下特殊匹配規則,如php等其余語言類似。

“.” ——————- 换行符之外的全部字符
“\w” —————- 匹配字母或数字或下划线或汉字
“\s” —————– 匹配任意的空白符
“\d” —————– 匹配数字
“\b” —————– 匹配单词的开始或结束
“^” —————— 匹配字符串的开始
“$” —————— 匹配字符串的结束
“*” —————— 重复零次或更屡次
“+” —————— 重复一次或更屡次
“?” ——————- 重复零次或一次
“{n}” —————- 重复n次
“{n,}” ————— 重复n次或更屡次
“{n,m}” ————- 重复n到m次
“[0-9]” ————– 匹配单个数字

rewritePattern 是针对Pattern 匹配后的URL进行rewritePattern 规定的替换。应用替换时,前面Pattern 第一个()中匹配的内容后面rewritePattern 就能够用$1引用,第二个()中匹配的就用$2应用……以此类推。

●在rewritePattern 以后追加特殊的标记[flags] 做为RewriteRule 指令的第三个参数。flags可使用的标记,和上面RewriteCond使用的同样

●举例说明RewriteRule语法

RewriteRule index.html index.php

好比:http://www.andelse.cn/index.html  -> http://www.andelse.cn/index.php

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

好比:http://www.andelse.cn/test8.html  -> http://www.andelse.cn/test.php?id=8

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

好比:http://www.andelse.cn/cat-1-3.html -> http://www.andelse.cn/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.andelse.cn/cat-zbc2ac-3-5.html -> http://www.andelse.cn/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.andelse.cn/cat1-4-3-8.html -> http://www.andelse.cn/cat1.php?id1=4&id2=3&id3=8

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

好比:http://www.andelse.cn/cat5/ -> http://www.andelse.cn/cat.php?id1=5

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

好比:http://www.andelse.cn/catm6/3/ -> http://www.andelse.cn/catm.php?id1=6&id2=3

相关文章
相关标签/搜索