.htaccess详解及.htaccess参数说明【转】

目录(?)[-]javascript

  1. htaccess 详解
  2. htaccess rewrite 规则详细说明
    1. RewriteEngine OnOff
    2. RewriteBase URL-path
    3. RewriteCond TestString CondPattern flags
    4. RewriteOptions Options
    5. RewriteRule Pattern Substitution flags
      1. redirectR code 强制重定向 redirect
      2. forbiddenF 强制URL为被禁止的 forbidden
      3. goneG 强制URL为已废弃的 gone
      4. proxyP 强制为代理 proxy
      5. lastL 最后一个规则 last
      6. nextN 从新执行 next round
      7. chainC 与下一个规则相连接 chained
      8. typeTMIME-type 强制MIME类型 type
      9. nosubreqNS 仅用于不对内部子请求进行处理 no internal sub-request
      10. nocaseNC 忽略大小写 no case
      11. qsappendQSA 追加请求串 query string append
      12. noescapeNE 在输出中不对URI做转义 no URI escaping
      13. passthroughPT 移交给下一个处理器 pass through
      14. skipSnum 跳事后继的规则 skip
      15. envEVARVAL 设置环境变量 environment variable
      16. cookieCONAMEVALdomainlifetimepath 设置cookie
    6. 全面理解htaccess语法中RewriteCond和RewriteRule意义
    7. URL重写 htaccess文件写法的10个技巧
      1. htaccess基本语法和应用
        1. 如何启用htaccess
        2. 禁止显示目录列表
      2. 用htaccess文件实现网站404错误
      3. 由浅入深剖析htaccess
        1. htaccess文件使用前提
        2. htaccess基本语法介绍
        3. 现学现用学习正则表达式
        4. 常见的htaccess应用举例部分例子引自四个例子实战讲解htaccess文件rewrite规则
          1. 1防止盗链若是来得要访问jpe jpg bmp png结尾的url 用户不是来自咱们的网站那么让他看一张咱们网站的展现图片
          2. 2 网站升级的时候只有特定IP才能访问其余的用户将看到一个升级页面
          3. 3把老的域名转向新域名
        5. 一些其余功能
          1. 1 引出错误文档的目录
          2. 2 Blocking users by IP 根据IP阻止用户访问
          3. 3 防止目录浏览
          4. 4设置默认首页
          5. 5 把一些老的连接转到新的连接上搜索引擎优化SEO
          6. 6为服务器管理员设置电子邮件
 

.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以做用于此目录及其全部子目录。做为用户,所能使用的命令受到限制。管理员能够经过Apache的AllowOverride指令来设置。php

概述来讲,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。经过htaccess文件,能够帮咱们实现:网页301重定向、自定义404错误页面、改变文件扩展名、容许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。css

.htaccess 详解

 

来源网址: http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.htmlhtml

.htaccess是什么java

启用.htaccess,须要修改httpd.conf,启用AllowOverride,并能够用AllowOverride限制特定命令的使用。若是须要使用.htaccess之外的其余文件名,能够用AccessFileName指令来改变。例如,须要使用.config ,则能够在服务器配置文件中按如下方法配置:AccessFileName .config 。linux

笼统地说,.htaccess能够帮咱们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只容许特定IP地址的用户、禁止目录列表,以及使用其余文件做为index文件等一些功能。web

工做原理正则表达式

.htaccess文件(或者”分布式配置文件”)提供了针对每一个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令做用于此目录及其全部子目录。
说明:
若是须要使用.htaccess之外的其余文件名,能够用AccessFileName指令来改变。例如,须要使用.config ,则能够在服务器配置文件中按如下方法配置:
AccessFileName .config
一般,.htaccess文件使用的配置语法和主配置文件同样。AllowOverride指令按类别决定了.htaccess文件中哪些指令才是有效的。若是一个指令容许在.htaccess中使用,那么在本手册的说明中,此指令会有一个覆盖项段,其中说明了为使此指令生效而必须在AllowOverride指令中设置的值。apache

(不)使用.htaccess文件的场合ubuntu

通常状况下,不该该使用.htaccess文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能经过.htaccess文件实现,其实并非这样,把用户认证写在主配置文件中是彻底可行的,并且是一种很好的方法。
.htaccess文件应该被用在内容提供者须要针对特定目录改变服务器的配置而又没有root权限的状况下。若是服务器管理员不肯意频繁修改配置,则能够容许用户经过.htaccess文件本身修改配置,尤为是ISP在同一个机器上运行了多个用户站点,而又但愿用户能够本身改变配置的状况下。
虽然如此,通常都应该尽量地避免使用.htaccess文件。任何但愿放在.htaccess文件中的配置,均可以放在主配置文件的<Directory>段中,并且更高效。
避免使用.htaccess文件有两个主要缘由。
首先是性能。若是AllowOverride启用了.htaccess文件,则Apache须要在每一个目录中查找.htaccess文件,所以,不管是否真正用到,启用.htaccess都会致使性能的降低。另外,对每个请求,都须要读取一次.htaccess文件。
还有,Apache必须在全部上级的目录中查找.htaccess文件,以使全部有效的指令都起做用(参见指令的生效),因此,若是请求/www/htdocs/example中的页面,Apache必须查找如下文件:
/.htaccess /www/.htaccess /www/htdocs/.htaccess /www/htdocs/example/.htaccess
总共要访问4个额外的文件,即便这些文件都不存在。(注意,这可能仅仅因为容许根目录”/”使用.htaccess ,虽然这种状况并很少。)

其次是安全。这样会容许用户本身修改服务器的配置,这可能会致使某些意想不到的修改,因此请认真考虑是否应当给予用户这样的特权。可是,若是给予用户较少的特权而不能知足其须要,则会带来额外的技术支持请求,因此,必须明确地告诉用户已经给予他们的权限,说明AllowOverride设置的值,并引导他们参阅相应的说明,以避免往后生出许多麻烦。
注意,在/www/htdocs/example目录下的.htaccess文件中放置指令,与在主配置文件中<Directory /www/htdocs/example>段中放置相同指令,是彻底等效的。

/www/htdocs/example目录下的.htaccess文件的内容:
AddType text/example .exm
httpd.conf文件中摘录的内容:
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
可是,把配置放在主配置文件中更加高效,由于只须要在Apache启动时读取一次,而不是在每次文件被请求时都读取。
将AllowOverride设置为none能够彻底禁止使用.htaccess文件:
AllowOverride None

指令的做用范围

.htaccess文件中的配置指令做用于.htaccess文件所在的目录及其全部子目录,可是很重要的、须要注意的是,其上级目录也可能会有.htaccess文件,而指令是按查找顺序依次生效的,因此一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。

疑难解答

若是在.htaccess文件中的某些指令不起做用,可能有多种缘由。
最多见的缘由是AllowOverride指令没有被正确设置,必须确保没有对此文件区域设置 AllowOverride None 。有一个很好的测试方法,就是在.htaccess文件随便增长点无心义的垃圾内容,若是服务器没有返回了一个错误消息,那么几乎能够判定设置了 AllowOverride None 。
在访问文档时,若是收到服务器的出错消息,应该检查Apache的错误日志,能够知道.htaccess文件中哪些指令是不容许使用的,也可能会发现须要纠正的语法错误。

.htaccess工具

不会写的朋友,在这介绍一款很不错.htaccess的重定向—URL重写工具rewriting-tool

——————————————————————————–

htaccess语法教程

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blog/$1

# 没有输入文件名的默认到到首页
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
RewriteRule ^(/)?$ blog/index.php [L]

下面我开始解说一下上面的意思:

RewriteEngine On】

表示重写引擎开,关闭off,做用就是方便的开启或关闭如下的语句,这样就不须要一条一条的注释语句了。

RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】

这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“/”,^表示 字符串开始,$表示字符串结尾,\.表示转义的. ,若是不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是若是访问的网址是xxx.com或者 www.xxx.com就执行如下的语句,不符合就跳过。

RewriteCond %{REQUEST_URI} !^/blog/】

也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$

RewriteCond %{REQUEST_FILENAME} !-f】

RewriteCond %{REQUEST_FILENAME} !-d】

这两句语句的意思是请求的文件或路径是不存在的,若是文件或路径存在将返回已经存在的文件或路径

RewriteRule ^(.*)$ /blog/$1】

重写规则,最重要的部分,意思是当上面的RewriteCond条件都知足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。

【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】

RewriteRule ^(/)?$ blog/index.php [L]】

这两句的意思是指请求的host地址是www.xxx.com是,若是地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜测这主要由于重写后的地址是不能自动寻找主页的,须要本身指定。

如今说说出现的问题,RewriteRule ^(.*)$ /blog/$1 前部分 ^(.*)$ 将会匹配当前请求的url。

例如:请求网址是http://www.xxx.com/a.html,究竟是匹配整个http://www.xxx.com/a.html,仍是只匹配/a.html即反斜杠后面的成分,仍是只匹配a.html。

答案是:根据RewriteBase规则规定,若是rewritebase 为/,将会匹配a.html,不带前面的反斜杠,因此上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也能够用,可能带不带都行。如今问题出来了,若是不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,因此应该添加这条:RewiteBase /

还有一个问题是,不能保证每一个人输入的网址都是小写的,若是输入大写的呢,linux系统是区分大小写的,因此应该在RewriteCond后添加[NC]忽略大小写的。

至此,完整的语句应该是:

RewriteEngine On
RewiteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ blog/$1

# 没有输入文件名的默认到到首页
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
RewriteRule ^(/)?$ blog/index.php [L]

若是后面还继续有语句的,就不该该加上最后的[L],由于这是表示最后一条语句的意思。

防盗链的语句,一样须要添加RewiteBase /,以下:

RewriteEngine on
RewiteBase /
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !xxx.info [NC]
RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]

若是后面还继续有语句的,就不该该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。

下面附上简单的语法规则和flags

【RewriteCond语法】

RewriteCond TestString CondPattern [flags]

rewritecond的其余用法:

“-d”(目录)

将TestString视为一个路径名并测试它是否为一个存在的目录。

“-f”(常规文件)

将TestString视为一个路径名并测试它是否为一个存在的常规文件。

“-s”(非空的常规文件)

将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。

“-l”(符号链接)

将TestString视为一个路径名并测试它是否为一个存在的符号链接。

“-x”(可执行)

将TestString视为一个路径名并测试它是否为一个存在的、具备可执行权限的文件。该权限由操做系统检测。

“-F”(对子请求存在的文件)

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

“-U”(对子请求存在的URL)

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

【RewriteRule语法:】

RewriteRule Pattern Substitution [flags]

【flags】

“chain|C”(连接下一规则)

此标记使当前规则与下一个规则相连接。它产生这样的效果:若是一个规则被匹配,则继续处理其后继规则,也就是这个标记不起做用;若是该规则不被匹配,则其后继规则将被跳过。好比,在一个目录级规则中执行一个外部重定向时,你可能须要删除”.www”(此处不该该出现”.www”)。

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

在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,好比”.apache.org”,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。

“env|E=VAR:VAL”(设置环境变量)

此标记将环境变量VAR的值为VAL,VAL能够包含可扩展的正则表达式反向引用($N和%N)。此标记能够屡次使用以设置多个变量。这些变量能够在其后许多状况下被间接引用,一般是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{“VAR”})中,也能够在后继的RewriteCond指令的CondPattern参数中经过%{ENV:VAR}引用。使用它能够记住从URL中剥离的信息。

“forbidden|F”(强制禁止URL)

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

“gone|G”(强制废弃URL)

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

“handler|H=Content-handler”(强制指定内容处理器)

强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的全部文件都由”cgi-script”处理器处理。

“last|L”(结尾规则)

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

“next|N”(从头再来)

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

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

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

“noescape|NE”(在输出中不对URI进行转义)

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

RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

可使”/foo/zed转向到一个安全的请求”/bar?arg=P1=zed”。

“nosubreq|NS”(不对内部子请求进行处理)

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

使用原则:若是你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种状况下,可使用这个标记。

“proxy|P”(强制为代理)

此标记使替换成分被内部地强制做为代理请求发送,并当即中断重写处理,而后把处理移交给mod_proxy模块。你必须确保此替换串是一个可以被mod_proxy处理的有效URI(好比以http://hostname开头),不然将获得一个代理模块返回的错误。使用这个标记,能够把某些远程成分映射到本地服务器域名空间,从而加强了ProxyPass指令的功能。

注意:要使用这个功能,必须已经启用了mod_proxy模块。

“passthrough|PT”(移交给下一个处理器)

此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,这个小小的修改使得RewriteRule指令的输出可以被(从URI转换到文件名的)Alias, ScriptAlias, Redirect等指令进行后续处理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。举一个能说明其含义的例子: 若是要将/abc重写为/def, 而后再使用mod_alias将/def转换为/ghi,能够这样:

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

Alias /def /ghi

若是省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运做正常,可是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。

注意:若是须要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。

“qsappend|QSA”(追加查询字符串)

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

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

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

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

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

此标记强制重写引擎跳过当前匹配规则以后的num个规则。它能够模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和”chain|C”标记是不一样的!

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

强制目标文件的MIME类型为MIME-type,能够用来基于某些特定条件强制设置内容类型。好比,下面的指令可让.php文件在以.phps扩展名调用的状况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显示:

RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]

.htaccess实例

http://cloudbbs.org/forum.php?mod=viewthread&tid=7455&page=1&extra=#pid41053

http://www.chinaz.com/web/2010/0415/111514.shtml

参考:http://baike.baidu.com/view/91163.htm

http://hi.baidu.com/wojiubaibudu/item/4b3513c74a8fe47aced4f817

.htaccess rewrite 规则详细说明

 

来源网址: http://www.cnphp.info/htaccess-rewrite.html

做者: freemouse 日期 2010年07月22日 | 能够转载, 但必须以超连接形式标明文章原始出处和做者信息及版权声明

网址: http://www.cnphp.info/htaccess-rewrite.html

用Apache虚拟主机的朋友不少,apache提供的.htaccess模块能够为每一个虚拟主机设定rewrite规则,这对网站SEO优化至关有用,同时也改善了用户体验。国内的虚拟机通常不提供.htaccess功能(据我所知,discuz的主机好像提供此功能),而在国外主机中,.htaccess功能彷佛是标配,笔者的Blog架在MT上,支持.htaccess,每次看到一堆别人写好了的.htaccess设置,不少命令都不甚了了,查看、修改起来很不方便,痛定思痛,潜心学习一下,知其因此然嘛~

学习前提:(不会的朋友要学习一下,才能更好的理解下面的文字呢)

  • Linux基础(不会也没事啦,写个.htaccess不必大费周折啦,推荐:鸟哥私房菜linux基础)
  • 正则表达式(Rewrite规则创建在正则的基础之上,推荐:正则表达式30分钟入门教程)

rewrite的语法格式

  1. RewriteEngine On #要想rewrite起做用,必需要写上哦
  2. RewriteBase url-path #设定基准目录,例如但愿对根目录下的文件rewrtie,就是”/”
  3. RewriteCond test-string condPattern #写在RewriteRule以前,能够有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。
  4. RewriteRule Pattern Substitution #规则

RewriteEngine On|Off

RewriteEngine 用于开启或停用rewrite功能。

rewrite configurations 不会自动继承,所以你得给每一个你想用 rewrite功能的虚拟主机目录中加上这个指令。

RewriteBase URL-path

RewriteBase用于设定重写的基准URL。在下文中,你能够看见RewriteRule能够用于目录级的配置文件中 (.htaccess)并在局部范围内起做用,即规则实际处理的只是剥离了本地路径前缀的一部分。处理结束后,这个路径会被自动地附着回去。默认值 是”RewriteBase physical-directory-path”。

在对一个新的URL进行替换时,此模块必须把这个URL从新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。一般,此前缀就是 对应的文件路径。可是,大多数网站URL不是直接对应于其物理文件路径的,于是通常不能作这样的假定! 因此在这种状况下,就必须用RewriteBase指令来指定正确的URL前缀。

若是你的网站服务器URL不是与物理文件路径直接对应的,而又须要使用RewriteBase指令,则必须在每一个对应的.htaccess文件中指定 RewriteRule 。

RewriteCond TestString CondPattern [flags]

RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令以前有一个或多个RewriteCond指令。 条件以后的重写规则仅在当前URI与pattern匹配而且符合这些条件的时候才会起做用。

TestString是一个纯文本的字符串,可是还能够包含下列可扩展的成分:

  1. RewriteRule反向引用: 引用方法是 $N  (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
  2. RewriteCond反向引用: 引用方法是 %N  (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
  3. RewriteMap 扩展: 引用方法是 ${mapname:key|default}
  4. 服务器变量: 引用方法是 %{ NAME_OF_VARIABLE }  这个是咱们最常使用到的功能

NAME_OF_VARIABLE具体数值见下表:

HTTP headers:

connection & request:

HTTP_USER_AGENT

HTTP_REFERER

HTTP_COOKIE

HTTP_FORWARDED

HTTP_HOST

HTTP_PROXY_CONNECTION

HTTP_ACCEPT

REMOTE_ADDR

REMOTE_HOST

REMOTE_USER

REMOTE_IDENT

REQUEST_METHOD

SCRIPT_FILENAME

PATH_INFO

QUERY_STRING

AUTH_TYPE

server internals:

system stuff:

specials:

DOCUMENT_ROOT

SERVER_ADMIN

SERVER_NAME

SERVER_ADDR

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

TIME_YEAR

TIME_MON

TIME_DAY

TIME_HOUR

TIME_MIN

TIME_SEC

TIME_WDAY

TIME

API_VERSION

THE_REQUEST

REQUEST_URI

REQUEST_FILENAME

IS_SUBREQ

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

IS_SUBREQ

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

API_VERSION

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

THE_REQUEST

这是由浏览器发送给服务器的完整的HTTP请求行。(好比, “GET /index.html HTTP/1.1″). 它不包含任何浏览器发送的附加头信息。

REQUEST_URI

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

REQUEST_FILENAME

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

CondPattern是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算而后与CondPattern匹配.

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

  1. 能够在pattern串中使用’
    1
    !

    ‘ 字符(惊叹号)来实现匹配的反转

RewriteOptions Options

1
RewriteOptions

指令为当前服务器级和目录级的配置设置一些选项。 Option能够是下列值之一:

1
inherit
此值强制当前配置能够继承其父配置。 在虚拟主机级配置中,它意味着主服务器的映射表、条件和规则能够被继承。 在目录级配置中,它意味着其父目录的
1
.htaccess

中的条件和规则能够被继承。

1
MaxRedirects=<var>number</var>
为了不目录级
1
RewriteRule

的无休止的内部重定向, 在此类重定向和500内部服务器错误次数达到一个最大值的时候,

1
mod_rewrite

会中止对此请求的处理。 若是你确实须要对每一个请求容许大于10次的内部重定向,能够增大这个值。

RewriteRule Pattern Substitution [flags]

1
RewriteRule

指令是重写引擎的根本。此指令能够屡次使用。 每一个指令定义一个简单的重写规则。这些规则的定义顺序尤其重要, 由于,在运行时刻,规则是按这个顺序逐一辈子效的.

Pattern是一个做用于当前URL的兼容perl的正则表达式。

此外,还可使用否字符(‘

1
!

‘)的pattern前缀,以实现pattern的反转。可是,须要注意的是使用否字符以反转pattern时,pattern中不能使用分组的通配成分;即$N。

重写规则中的Substitution是, 当原始URL与Pattern相匹配时,用以替代(或替换)的字符串。除了纯文本,还可使用

  • 1
    $N

    反向引用RewriteRule的pattern

  • 1
    %N

    反向引用最后匹配的RewriteCond pattern

  • 规则条件测试字符串中(
    1
    %{VARNAME}

    )的服务器变量

  • 映射函数调用(
    1
    ${mapname:key|default})
下面给出几个完整的例子供各位参考:

1、防盗链功能

只这四行就实现了防盗链是否是很神奇^_^,编写起来是否是又以为复杂。

 

RewriteEngine On

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

RewriteCond %{HTTP_REFERER} !^$

RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

2、网址规范化

这个是把全部二级域名都重定向到www.yourdomain.com的例子,如今看来是否是很简单了?

Options +FollowSymLinks

rewriteEngine on

rewriteCond %{http_host} ^yourdomain.com [NC]

rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

3、临时错误页面

当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没作完的页面或者是错误页。

RewriteEngine on

RewriteCond %{REQUEST_URI} !/maintenance.html$

RewriteCond %{REMOTE_ADDR} !^123.123.123.123

RewriteRule $ /error.html [R=302,L]

4、重定向RSS地址到FeedSky

除了能够更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]

RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]

RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours

=========================================================================================

附录:flags

  1. ‘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’标记.

  2. ‘forbidden|F’ (强制URL为被禁止的 forbidden)

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

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

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

  4. ‘proxy|P’ (强制为代理 proxy)

    此标记使替换成分被内部地强制为代理请求,并当即(即, 重写规则处理当即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(好比常见的以 http://hostname开头的)可以为Apache代理模块所处理的URI。 使用这个标记,能够把某些远程成分映射到本地服务器名称空间, 从而加强了ProxyPass指令的功能。 注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 若是你不能肯定,能够检查“httpd -l”的输出中是否有mod_proxy.c。 若是有,则mod_rewrite可使用这个功能; 若是没有,则必须启用mod_proxy并从新编译“httpd”程序。

  5. ‘last|L’ (最后一个规则 last)

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

  6. ‘next|N’ (从新执行 next round)

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

  7. ‘chain|C’ (与下一个规则相连接 chained)

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

  8. ‘type|T=MIME-type’ (强制MIME类型 type)

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

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

    在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。 好比,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不必定有用的,并且若是整个规则集都起做用, 它甚至可能会引起错误。因此,能够用这个标记来排除某些规则。 根据你的须要遵循如下原则: 若是你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种状况下,可使用这个标记。

  10. ‘nocase|NC’ (忽略大小写 no case)

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

  11. ‘qsappend|QSA’ (追加请求串 query string append)

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

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

    此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 通常状况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记能够阻止这样的转义,以容许百分号等符号出如今输出中,如: RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

    可使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

  13. ‘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。

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

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

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

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

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

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

深刻阅读:http://oss.org.cn/man/newsoft/ApacheManual/mod/mod_rewrite.html

全面理解.htaccess语法中RewriteCond和RewriteRule意义

 

来源网址: http://blog.sina.com.cn/s/blog_7048e38101017xdx.html

(2012-08-13 10:38:44)

关于.htaccess伪静态的使用,章郎虫一直没有好好想过。之前一直是在网上找现成的,而后修改下网址实现重定向。今天我专门找资料看了下RewriteCond和RewriteRule的意思及使用方法。而后回过头看《网站地址更改之htaccess和php的301重定向》这篇文章,终于有些理解。如今不用一直找现成的代码,也能够本身写一些规则实现重定向了。下面就简单的介绍下他们的用法。

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。

RewriteRule的语法

RewriteRule Pattern Substitution [Flags]

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

.htaccess中用到的正则

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

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

$匹配结尾。

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

若是你对正则表达式不是很明白,能够看下正则表达式的教程

Source from: http://www.hellonet8.com/897.html

 

URL重写 htaccess文件写法的10个技巧

 

来源网址: http://blog.sina.com.cn/s/blog_7069146d01015ikf.html

(2012-07-26 03:25:44)

“.htaccess”文件每每被网页设计师们忽略。假如你还不知道什么是htaccess的话,你能够去查一下wikipedia。它是目录级别的配置文件,有经常使用的网页服务器支持这种配置,例如Apache。下面我将列出10条有用的.htaccess配置技巧。

1. 反盗链

那些盗用了你的内容,还不肯意本身存储图片的网站是无耻的。你能够经过如下配置来放置别人盗用你的图片:

RewriteBase /

RewriteCond %{HTTP_REFERER} !^$

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

RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

2. 防止目录浏览

有时候目录浏览是有用的,但大部分状况会有安全问题。为了让你的网站更安全,你能够经过htaccess文件来禁用这个功能:

Options All -Indexes

3. SEO友好的301永久重定向

这一招是我经常使用的。每次我更改网站URL结构的时候,我都会作301重定向:

Redirect 301 http://www.yoursite.com/article.html http://www.yoursite.com/archives/article 4. 显示个性化的 404 错误页面

当用户访问了一个不存在的页面的时候,网页服务器会显示“404 file not found”错误。有不少CMS可让你设置自定义的错误页面,但最简单的方法是更改htaccess:

ErrorDocument 404 /404.html

5. 设置目录的默认页面

假如你须要为不一样的目录设置不一样的默认页面,你能够很容易的经过 .htaccess 实现:

DirectoryIndex about.html

6. 基于referer来限制网站访问

站长一般不会限制网站访问,可是当你发现有一些网站尽给你带来垃圾流量的话,你就应该屏蔽他们:

<IfModule mod_rewrite.c>

RewriteEngine on  RewriteCond %{HTTP_REFERER} spamteam.com [NC,OR]

RewriteCond %{HTTP_REFERER} trollteam.com [NC,OR]

RewriteRule .* – [F]

</ifModule>

7. 限制PHP上传文件大小

这招在共享空间的服务器上颇有用,可让个人用户上传更大的文件。第一个是设置最大的上传文件大小,第二个是设置最大的POST请求大小,第三个PHP脚本最长的执行时间,最后一个是脚本解析上传文件的最长时间:

php_value upload_max_filesize 20M

php_value post_max_size 20M

php_value max_execution_time 200

php_value max_input_time 200

8. 压缩文件

你能够经过压缩文件来减小网络流量,也页面装载时间:

AddOutputFilterByType DEFLATE text/plain

AddOutputFilterByType DEFLATE text/html

AddOutputFilterByType DEFLATE text/xml

AddOutputFilterByType DEFLATE text/css

AddOutputFilterByType DEFLATE application/xml

AddOutputFilterByType DEFLATE application/xhtml+xml

AddOutputFilterByType DEFLATE application/rss+xml

AddOutputFilterByType DEFLATE application/javascript

AddOutputFilterByType DEFLATE application/x-javascript

9. 缓存文件

这一点还须要解释吗?

<FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$”>

Header set Cache-Control “max-age=2592000〃

</FilesMatch>

10. 添加尾部的反斜杠

我并不肯定,可是不少文章,不少人都说添加尾部反斜杠有益于SEO:

<IfModule mod_rewrite.c>

RewriteCond %{REQUEST_URI} /+[^\.]+$

RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

</IfModule>

====================

引用:http://www.c658.com/658/html/xxlm/itxxl/882.html

.htaccess基本语法和应用

.htaccess是Apache服务器的一个很是强大的分布式配置文件。

正确的理解和使用.htaccess文件,能够帮助咱们优化本身的服务器或者虚拟主机。

如何启用htaccess

以windows为例,进入apache/conf目录,找到httpd.conf文件,去掉

LoadModule rewrite_module modules/mod_rewrite.so

前面的#,而后设置目录属性AllowOverride All,重启apache便可

下面是一个典型的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)表示忽略大小写,常见的还有

  • [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

<Files page.html>
allow from all
</Files>

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

添加MIME类型

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

用.htaccess文件实现网站404错误

 

来源网址: http://www.os1010.com/archives/618

做者:admin  发表于:2012年06月11日 09:25  分类:SEO技术     字体: 小 中 

定义404错误 页对网站SEO的做用仍是很大的,404 错误意味着连接指向的网页不存在,即原始网页的URL失效,这种状况常常会发生,很难避免,当Web 服务器接到相似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。可是,Web服务器默认的404错误页面,十分呆板,并且对SEO是不利,对于网站流量也是很大的损失。

如今大多数主机都提供设置404页面的接口,这样的不管是国内主机仍是国外主机都很好设置,不过仍然有很多主机不提供设置页面,这样的可能是国内主机和一些免费主机,本文主要是针对这些主机,并且是针对PHP主机。

1. Apache下设置404错误页面(通常是Linux主机)

(1)           在.htaccess 文件(若是没有则新建一个)中加入以下内容:ErrorDocument 404 /404.html,将.htaccess文件上传到网站根目录

注:也可使用这样的命令

ErrorDocument 404 http://www.iewb.net/404.htm

ErrorDocument 500 http://www.iewb.net/500.htm

(2)           制做一个404页面,随便您设计,命名为404.html,一样上传到网站根目录。若是您还想设置500页面,还能够在.htaccess命令里加上ErrorDocument 404 /500.html 并制做一个500页面传到网站根目录

网友没必要检验本站的404页面了,由于本站用的是godaddy免费的空间,404页面会有广告。

本文由新将来博客(www.os1010.com)整理,转载请注明!

本文固定连接: http://www.os1010.com/archives/618 | WordPress主机|香港主机空间|香港高速主机|新将来博客

由浅入深剖析.htaccess

 

来源网址: http://blog.csdn.net/cdefg198/article/details/6645759

2011-07-29 23:36 210人阅读 评论(0) 收藏 举报

一、.htaccess文件使用前提

.htaccess的主要做用就是实现url改写,也就是当浏览器经过url访问到服务器某个文件夹时,做为主人,咱们能够来接待这个url,具体地怎样接待它,就是此文件的做用。全部的访问都是经过URL实现,因此.htaccess的做用非同小可。正由于此,因此通常地网站经过设置.htaccess,经过一个十分友好的url吸引用户进来,而后用.htaccess把用户带到须要访问的位置。

要想使用这个强大功能,就得开启apache里面的重写模块。

前面的文章中曾经讲到过windows和ubuntu开启 rewrite模块使用.htaccess 。

其实开启模块大致的步骤都是同样的,不管是Windows和linux。

二、.htaccess基本语法介绍

开启重写引擎 :RewriteEngine on

设置重写的根目录:RewriteBase /     — 说明 :由于定义了这个文件夹,因此对应的替换就有了一个参照。

匹配全部符合条件的请求:RewriteCond       — 说明:RewriteCond 定义了一系列规则条件,这个指令能够有一条或者多条,只有用户拿来的url符合这些条件以后,咱们的.htaccess才开始接待,不然用户就直接本身去访问所须要的目录了。

举个例子,为了能让搜索引擎更多地抓取咱们的网页而避免重复抓,咱们一般把没有www的域名重定向到www.XXX.com,以下就实现了这个功能:

RewriteEngine On

RewriteCond %{HTTP_HOST}  ^nbphp\.com$ [NC]

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

上例便把nbphp.com 重定向到www.nbphp.com

%{HTTP_HOST} 是指取得用户访问的URL的主域名  而后空格后面是一个正则表达式匹配,意识就是说是不是 nbphp.com 。

若是用户访问使用的URL知足全部列出的RewriteCond 提出的条件,那么进行下一步RewriteRule 即开始进行引导,这才开始实现.htaccess文件的重要功能。

一样,前面是正则表达式,用户分析用户的除了主域名nbphp.com以外的URL ,^(.*)$的意思就是全部的内容。 而后空格后面写的是咱们引导用户访问的目录,咱们带着他走到新的一个域名上。$1 指的是前面括号里匹配url所获得的内容。

这样就是一个完整的小例子。关于RewriteCond里 如何调用url的某个部分,咱们能够参考这篇文章(Apache的Mod_rewrite学习 (RewriteCond重写规则的条件);

三、现学现用,学习正则表达式。

推荐一个经典的教程: 正则表达式30分钟入门教程

这个教程的确很简单,看完基本上写一些简单的正则就没有问题了。正则是一个须要长期使用的工具,隔段时间不用会忘记,因此我每次都看一遍这个教程。其实学过以后重要的就是一点内容。我简单罗列了以下:

.  换行符之外的全部字符

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

\s匹配任意的空白符

\d匹配数字

\b匹配单词的开始或结束

^匹配字符串的开始

$匹配字符串的结束

*重复零次或更屡次

*重复零次或更屡次

+重复一次或更屡次

?重复零次或一次

{n}重复n次

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

{n,m}重复n到m次

应用替换时,前面第一个()中匹配的内容后面就用$1引用,第二个()中匹配的就用$2应用……

推荐一个实用的正则在线测试网站 http://www.regextester.com/

咱们来分析一下 discuz7.0 搜索引擎优化 htaccess 里面的重写。

RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$  forumdisplay.php?fid=$1&page=$2

首先加入用户经过 nbphp.com/forum-2-3.html 访问discuz论坛,那么先经过.htaccess过滤,看看是否须要.htaccess引导一下用户,若是知足列出的一系列RewriteCond的条件那么就进行重写,discuz的没有列出RewriteCond 因此应该所有都进行重写。因此开始进行转写,forum-2-3.html 这个正好符合 列出的^forum-([0-9]+)-([0-9]+)\.html$ 正则表达式。而且 $1 为 2  ,$2为3 ,因此代入后面,即 forumdisplay.php?fid=2&page=3 加上前面的RewriteBase 指定的文件目录,那么就带他到制定目录的forumdisplay.php?fid=2&page=3 。

四、常见的.htaccess应用举例(部分例子引自四个例子实战讲解.htaccess文件rewrite规则)
4.1防止盗链,若是来得要访问jpe jpg bmp png结尾的url 用户不是来自咱们的网站,那么让他看一张咱们网站的展现图片。

RewriteEngine On

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

RewriteCond %{HTTP_REFERER} !^$

RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

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

RewriteEngine on

RewriteCond %{REQUEST_URI} !/upgrade.html$

RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30

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

4.3把老的域名转向新域名

# redirect from old domain to new domain

RewriteEngine On

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

五、一些其余功能
5.1 引出错误文档的目录

ErrorDocument 400 /errors/badrequest.html

ErrorDocument 404   http://yoursite/errors/notfound.html

ErrorDocument 401 “Authorization Required

5.2 Blocking users by IP 根据IP阻止用户访问

order allow,deny

deny from 123.45.6.7

deny from 12.34.5. (整个C类地址)

allow from all

5.3 防止目录浏览

# disable directory browsing

Options All -Indexes

5.4设置默认首页

# serve alternate default index page

DirectoryIndex about.html

5.5 把一些老的连接转到新的连接上——搜索引擎优化SEO

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

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

ServerSignature EMail

SetEnv SERVER_ADMINdefault@domain.com

本文章主要介绍了应用最广最实用的重写功能,记住.htaccess的权限要设置成644

原文连接: .htaccess详解及.htaccess参数说明

©本文由 廖 收集整理,引用内容若有犯权请留言,转载请注明原文连接
相关文章
相关标签/搜索