伪静态与重定向--RewriteRule

环境:windows 10,phpstudy,sublime text。服务器使用Apache,网站根目录为E:\phpstudy\www\,因此.htaccess放在www目录下。php

RewriteRule语法说明:html

RewriteRule  模式匹配  替换的URL  [flags]正则表达式

模式匹配使用perl语言的正则表达式语法,同时还可使用一些rewrite预约义的变量windows

替换的URL支持模式匹配的结果和rewrite变量xcode

多个flag用逗号隔开服务器

例子1网站

此时根目录只有index.htm,将全部访问 *.htm的请求都重定向到  *.html搜索引擎

RewriteEngine On
RewriteRule ^(.*)\.htm$ $1.html
# $1在正则表达式中表示前面第一个匹配的子表达式,即.*部分 

  注意配置中的RewriteEngine On表示开启重写,注意请求的URL是 index.htm ,重定向到index.html,可是地址栏仍然为index.htmurl

 若是在根目录建立一个index.html文件,再刷新的话,结果就不一样了:spa

 

RewriteRule R flag说明

R表示强制外部重定向,后面能够加301(永久重定向)或者302(暂时重定向)跳转,不加默认302(暂时重定向),加了R flag以后,地址栏的URL会改变

这两种重定向的区别在于:SEO搜索引擎对网站是有评分的,若是使用临时重定向,则不会将搜索引擎对之前URL的评分 给 临时重定向(新的)的网站URL,会为新的URL产生一个新的评分;而永久重定向则会将评分转给新的URL。

使用示例:

  此时根目录为空,仍旧访问localhost/index.htm

RewriteEngine On
RewriteRule ^(.*)\.htm$ $1.html [R]
#等价于下面这一条
#RewriteRule ^(.*)\.htm$ $1.html [R=302]

注意上面的图片中,外部重定向时,地址栏的URL发生了改变,而且是按照磁盘的路径去查找,而不是按照网站根目录去查找,这时能够在$1前面加一个斜线 / ,表示重定向的基地址为网站根目录,以下例:

RewriteEngine On
RewriteRule ^(.*)\.htm$ /$1.html [R]
#等价于下面这一条
#RewriteRule ^(.*)\.htm$ /$1.html [R=302]

建立index.html文件,再访问localhost/index.htm

 

 

RewriteRule C flag说明

C表示连接下一规则,若是在一条规则后面加了该flag后,这条规则就和下一条规则成为一个总体,若是这一条规则不匹配,那么下一条也不进行匹配,相似于“拉着别人下水的”的情景。

注意这里的匹配的时候,前一条的匹配以后,URL改变了,而后,将新的URL进行下一条规则的匹配。

实例:

  网站根目录下只有index.html和index.php文件,

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/$1.html [C]
RewriteRule ^(.*)\.html$	/$1.php

  如今结果以下图:

而若是直接访问index.html,那么由于不匹配第一条规则,因此不进行第二条规则匹配,不会重定向到index.php,会直接输出index.html的内容。

 

RewriteRule L flag说明

若是一条规则的后面添加了这个L flag,那么若是这条规则匹配,就不在进行下一条规则的匹配,若是改规则不匹配,则会继续进行下一规则的匹配。

实例:

  根目录下有index.html,index.php,访问index.htm,由于匹配到了第一条规则,而且后面有L flag,因此不会匹配下面一条

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/$1.html [L]
RewriteRule ^(.*)\.html$	/$1.php

  

若是直接访问index.html,由于第一条规则没有匹配,那么会接着匹配第二条规则。

 

RewriteRule NE flag 说明

不对URL中的字符进行hexcode转码,好比咱们传递一个参数,那么

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/index.html#$1  [R]

访问localhost/index.htm

能够看到#被转移成了十六进制的%23,加上NE参数

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/index.html#$1  [R,NE]

  

 

 RewriteRule NC flag说明

NC是指在匹配时,不区分大小写。由于在Apache自己对大小写是敏感的,

实例:

RewriteEngine On
RewriteRule ^index.htm index.html 

能够看到,并无匹配第一条规则,由于此时是区分大小写的。加上NC以后,刷新:

RewriteEngine On
RewriteRule ^index.htm index.html [NC]

 

 RewriteRule G flag说明

表示请求的网页已经失效(对应响应码的410),而且中止后续规则的匹配

RewriteEngine On
RewriteRule .* - [G]
#RewriteRule .* index.html

 

 RewriteRule QSA flag说明

用于在URL中截取查询字段,也就是保留用URL传递的参数,由于默认是会将参数截取掉的

RewriteEngine On
RewriteRule ^per/(.*)$ /per.php?url=$1 [R]

  访问localhost/per/index.htm?id=5

若是没有QSA字段,传递的id=5被截取掉了。若是加上QSA字段:

RewriteEngine On
RewriteRule ^per/(.*)$ /per.php?url=$1 [R,QSA]

  再次访问localhost/per/index.htm?id=5

相关文章
相关标签/搜索