.htaccess文件(或者”分布式配置文件”)提供了针对文件夹改变配置的方法。 即。在一个特定的文档文件夹中放置一个包括一个或多个指令的文件, 以作用于此文件夹及其所有子文件夹。
作为用户。所能使用的命令受到限制。管理员能够通过Apache的AllowOverride指令来设置。
概述来说,htaccess文件是Apacheserver中的一个配置文件,它负责相关文件夹下的网页配置。通过htaccess文件。能够帮我们实现:网页301重定向、自己定义404错误页面、改变文件扩展名、同意/阻止特定的用户或者文件夹的訪问、禁止文件夹列表、配置默认文档等功能。
.htaccess 具体解释
.htaccess是什么
启用.htaccess,须要改动httpd.conf。启用AllowOverride,并能够用AllowOverride限制特定命令的使用。
假设须要使用.htaccess以外的其它文件名称,能够用AccessFileName指令来改变。比如,须要使用.config ,则能够在server配置文件里按下面方法配置:AccessFileName .config 。
笼统地说,.htaccess能够帮我们实现包含:文件夹password保护、用户自己主动重定向、自己定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、仅仅同意特定IP地址的用户、禁止文件夹列表,以及使用其它文件作为index文件等一些功能。
工作原理
.htaccess文件(或者”分布式配置文件”)提供了针对每一个文件夹改变配置的方法,即在一个特定的文件夹中放置一个包括指令的文件,当中的指令作用于此文件夹及其全部子文件夹。
说明:
假设须要使用.htaccess以外的其它文件名称,能够用AccessFileName指令来改变。
比如。须要使用.config ,则能够在server配置文件里按下面方法配置:
AccessFileName .config
通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件里哪些指令才是有效的。假设一个指令同意在.htaccess中使用,那么在本手冊的说明中,此指令会有一个覆盖项段,当中说明了为使此指令生效而必须在AllowOverride指令中设置的值。
(不)使用.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的语法格式:
- RewriteEngine On #要想rewrite起作用,必需要写上哦
- RewriteBase url-path #设定基准文件夹。比如希望对根文件夹下的文件rewrtie,就是”/”
- RewriteCond test-string condPattern #写在RewriteRule之前,能够有一或N条,用于測试rewrite的匹配条件,具体怎么写,后面会具体说到。
- 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是一个纯文本的字符串,可是还能够包括下列可扩展的成分:
- RewriteRule反向引用: 引用方法是 $N (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
- RewriteCond反向引用: 引用方法是 %N (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
- RewriteMap 扩展: 引用方法是 ${mapname:key|default}
- 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的正則表達式。 可是还有若干补充:
- 能够在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})
以下给出几个完整的样例供各位參考:
一、防盗链功能
仅仅这四行就实现了防盗链是不是非常奇妙^_^,编写起来是不是又认为复杂。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
二、网址规范化
这个是把全部二级域名都重定向到www.yourdomain.com的样例,如今看来是不是非常easy了?
Options +FollowSymLinks
rewriteEngine on
rewriteCond %{http_host} ^yourdomain.com [NC]
rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
三、暂时错误页面
当你的站点在升级、改动的时候,你最好让訪客转到指定的页面,而不是没做完的页面或者是错误页。
RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /error.html [R=302,L]
四、重定向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
-
‘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’标记.
-
‘forbidden|F’ (强制URL为被禁止的 forbidden)
强制当前URL为被禁止的,即,马上反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,能够链接若干RewriteConds以有条件地堵塞某些URL。
-
‘gone|G’ (强制URL为已废弃的 gone)
强制当前URL为已废弃的。即。马上反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,能够标明页面已经被废弃而不存在了.
-
‘proxy|P’ (强制为代理 proxy)
此标记使替换成分被内部地强制为代理请求,并马上(即, 重写规则处理马上中断)把处理移交给代理模块。
你必须确保此替换串是一个有效的(比方常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。
使用这个标记,能够把某些远程成分映射到本地server名称空间, 从而增强了ProxyPass指令的功能。 注意: 要使用这个功能,代理模块必须编译在Apacheserver中。 假设你不能确定,能够检查“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\%3d$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)
它在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在同一个键位上的符号)和$都匹配一个位置,这和有点类似。
^匹配你要用来查找的字符串的开头
$匹配结尾。
比方一个站点假设要求你填写的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) 收藏 举报
1、.htaccess文件使用前提
.htaccess的主要作用就是实现url改写,也就是当浏览器通过url訪问到server某个目录时。作为主人,我们能够来接待这个url,详细地如何接待它。就是此文件的作用。全部的訪问都是通过URL实现,所以.htaccess的作用非同小可。正由于此,所以一般地站点通过设置.htaccess。通过一个十分友好的url吸引用户进来,然后用.htaccess把用户带到须要訪问的位置。
要想使用这个强大功能,就得开启apache里面的重写模块。
前面的文章中以前讲到过windows和ubuntu开启 rewrite模块使用.htaccess 。
事实上开启模块大体的步骤都是一样的,不管是Windows和linux。
2、.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重写规则的条件);
3、现学现用,学习正則表達式。
推荐一个经典的教程: 正則表達式30分钟新手教程
这个教程的确非常easy。看完基本上写一些简单的正则就没有问题了。正则是一个须要长期使用的工具,隔段时间不用会忘记。所以我每次都看一遍这个教程。
事实上学过之后重要的就是一点内容。
我简单罗列了例如以下:
. 换行符以外的全部字符
w匹配字母或数字或下划线或汉字
s匹配随意的空白符
d匹配数字
匹配单词的開始或结束
^匹配字符串的開始
$匹配字符串的结束
*反复零次或很多其它次
*反复零次或很多其它次
+反复一次或很多其它次
?反复零次或一次
{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 。
4、常见的.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、一些其它功能
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參数说明