server.htaccess 具体解释以及 .htaccess 參数说明

.htaccess文件(或者”分布式配置文件”)提供了针对文件夹改变配置的方法。 即。在一个特定的文档文件夹中放置一个包括一个或多个指令的文件, 以做用于此文件夹及其全部子文件夹。javascript

做为用户。所能使用的命令受到限制。管理员可以经过Apache的AllowOverride指令来设置。php

概述来讲,htaccess文件是Apacheserver中的一个配置文件,它负责相关文件夹下的网页配置。经过htaccess文件。可以帮咱们实现:网页301重定向、本身定义404错误页面、改变文件扩展名、赞成/阻止特定的用户或者文件夹的訪问、禁止文件夹列表、配置默认文档等功能。css

.htaccess 具体解释


.htaccess是什么html

启用.htaccess,需要改动httpd.conf。启用AllowOverride,并可以用AllowOverride限制特定命令的使用。java

假设需要使用.htaccess之外的其它文件名称,可以用AccessFileName指令来改变。好比,需要使用.config ,则可以在server配置文件里按下面方法配置:AccessFileName .config 。linux

笼统地说,.htaccess可以帮咱们实现包含:文件夹password保护、用户本身主动重定向、本身定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、仅仅赞成特定IP地址的用户、禁止文件夹列表,以及使用其它文件做为index文件等一些功能。web

工做原理apache

.htaccess文件(或者”分布式配置文件”)提供了针对每个文件夹改变配置的方法,即在一个特定的文件夹中放置一个包括指令的文件,当中的指令做用于此文件夹及其所有子文件夹。
说明:
假设需要使用.htaccess之外的其它文件名称,可以用AccessFileName指令来改变。ubuntu

好比。需要使用.config ,则可以在server配置文件里按下面方法配置:
AccessFileName .config
一般,.htaccess文件使用的配置语法和主配置文件同样。AllowOverride指令按类别决定了.htaccess文件里哪些指令才是有效的。假设一个指令赞成在.htaccess中使用,那么在本手冊的说明中,此指令会有一个覆盖项段,当中说明了为使此指令生效而必须在AllowOverride指令中设置的值。windows

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

普通状况下。不该该使用.htaccess文件。除非你对主配置文件没有訪问权限。

有一种非常常见的误解。以为用户认证仅仅能经过.htaccess文件实现。事实上并不是这样。把用户认证写在主配置文件里是全然可行的,而且是一种很是好的方法。


.htaccess文件应该被用在内容提供者需要针对特定文件夹改变server的配置而又没有root权限的状况下。

假设server管理员不肯意频繁改动配置,则可以赞成用户经过.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 ,尽管这样的状况并很少。

)

其次是安全。

这样会赞成用户本身改动server的配置,这可能会致使某些意想不到的改动。因此请认真考虑是否应当给予用户这种特权。但是,假设给予用户较少的特权而不能知足其需要,则会带来额外的技术支持请求。因此,必须明白地告诉用户已经给予他们的权限。说明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文件随便添加点无心义的垃圾内容,假设server没有返回了一个错误消息,那么差点儿可以判定设置了 AllowOverride None 。
在訪问文档时,假设收到server的出错消息,应该检查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://”和“/”,^表示 字符串開始。$表示字符串结尾,\.表示转义的. ,假设不转义也行。推荐转义,防止有些server不支持,?表示前面括号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是否为一个有效的文件,而且可以在server当前的訪问控制配置下被訪问。

它使用一个内部子请求来作检查。由于会减小server的性能,因此请慎重使用!

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

检查TestString是否为一个有效的URL,而且可以在server当前的訪问控制配置下被訪问。

它使用一个内部子请求来作检查,由于会减小server的性能,因此请慎重使用!

【RewriteRule语法:】

RewriteRule Pattern Substitution [flags]

【flags】

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

此标记使当前规则与下一个规则相连接。

它产生这种效果:假设一个规则被匹配,则继续处理其后继规则。也就是这个标记不起做用;假设该规则不被匹配。则其后继规则将被跳过。

比方,在一个文件夹级规则中运行一个外部重定向时。你可能需要删除”.www”(此处不该该出现”.www”)。

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

在client设置一个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开头),不然将获得一个代理模块返回的错误。使用这个标记,能够把某些远程成分映射到本地server域名空间,从而加强了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反馈给client,如将”/~”重写为”/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又一次注入到server处理中。为此。它必须知道其相应的URL前缀或者说URL基准。

一般,此前缀就是 相应的文件路径。

但是,大多数站点URL不是直接相应于其物理文件路径的,于是通常不能作这种假定! 因此在这种状况下。就必须用RewriteBase指令来指定正确的URL前缀。

假设你的站点serverURL不是与物理文件路径直接相应的,而又需要使用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. server变量: 引用方法是 %{ 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头、Apacheserver的C变量以及Unix系统中的 struct tm字段,大多数都在其它的手冊或者CGI规范中有所讲述。

而当中为mod_rewrite所特有的变量有:

IS_SUBREQ

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

API_VERSION

这是正在使用的httpd中(server和模块之间内部接口)的Apache模块API的版本号, 其定义位于include/ap_mmn.h中。此模块版本号相应于正在使用的Apache的版本号 (比方,在Apache 1.3.14的发行版中,这个值是19990320:10)。

一般,对它感兴趣的是模块的做者。

THE_REQUEST

这是由浏览器发送给server的完整的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

指令为当前server级和文件夹级的配置设置一些选项。

 Option可以是下列值之中的一个:

1
inherit
此值强制当前配置可以继承其父配置。 在虚拟主机级配置中,它意味着主server的映射表、条件和规则可以被继承。 在文件夹级配置中,它意味着其父文件夹的
1
.htaccess

中的条件和规则可以被继承。

1
MaxRedirects=<var>number</var>
为了不文件夹级
1
RewriteRule

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

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}

    )的server变量

  • 映射函数调用(
    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的样例,现在看来是否是很是easy了?

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反馈给client,如, 重写“/~”为 “/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。

    使用这个标记,可以把某些远程成分映射到本地server名称空间, 从而加强了ProxyPass指令的功能。 注意: 要使用这个功能,代理模块必须编译在Apacheserver中。 假设你不能肯定,可以检查“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)

    它在client浏览器上设置一个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。

它是文件夹级别的配置文件,有常用的网页server支持这样的配置,好比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 错误页面

当用户訪问了一个不存在的页面的时候,网页server会显示“404 file not found”错误。有很是多CMS可以让你设置本身定义的错误页面,但最简单的方法是更改htaccess:

ErrorDocument 404 /404.html

5. 设置文件夹的默认页面

假如你需要为不一样的文件夹设置不一样的默认页面,你可以很是easy的经过 .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上传文件大小

这招在共享空间的server上很是实用,可以让个人用户上传更大的文件。

第一个是设置最大的上传文件大小。第二个是设置最大的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是Apacheserver的一个很强大的分布式配置文件。

正确的理解和使用.htaccess文件,可以帮助咱们优化本身的server或者虚拟主机。

怎样启用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是比較easy伪造的

本身定义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 server接到相似请求时。会返回一个404 状态码,告诉浏览器要请求的资源并不存在。

但是,Webserver默认的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訪问到server某个目录时。做为主人,咱们可以来接待这个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分钟新手教程

这个教程的确很是easy。看完基本上写一些简单的正则就没有问题了。正则是一个需要长期使用的工具,隔段时间不用会忘记。因此我每次都看一遍这个教程。

事实上学过以后重要的就是一点内容。

我简单罗列了例如如下:

.  换行符之外的所有字符

\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为server管理员设置电子邮件。

ServerSignature EMail

SetEnv SERVER_ADMINdefault@domain.com

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

原文连接: .htaccess具体解释及.htaccess參数说明

©本文由 吕 收集整理。引用内容若有犯权请留言,转载请注明原文连接

相关文章
相关标签/搜索