apache 配置.htaccess实现伪静态 url重写

文章转载自:

https://www.cnblogs.com/-beyond/p/8325144.html

https://blog.csdn.net/expleeve/article/details/6621885/

apache 配置.htaccess实现伪静态 url重写

       图-1:重写规则集中的控制流

使用apache伪静态需要修改apache配置文件,开启Rewrite重写模块

#开启重写引擎
RewriteEngine On

1.RewriteRule 根据匹配规则,重写url

RewriteRule语法说明:

RewriteRule  模式匹配  替换的URL  [flags]

   内部重定向

#开启重写引擎
RewriteEngine On
#内部重定向
#RewriteRule ^(.*).htm$ $1.

apache 配置.htaccess实现伪静态 url重写

 使用内部重定向浏览器地址不会发生变化

外部重定向

#开启重写引擎
RewriteEngine On
#R参数-外部重定向 301永久重定向,对搜索引擎友好,302临时重定向
RewriteRule ^(.*).hta$ $1.html [R=301]

 apache 配置.htaccess实现伪静态 url重写

 外部重定向利用http协议告诉浏览器进行跳转,这里有个问题就是路径加载错误

RewriteRule ^(.*).hta$ /$1.html [R=301]
这里需要在重写后的地址前面加“/”,另外一种方式是设置RewriteBase url重写基准目录

RewriteRule C flag

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

注意这里的匹配的时候,前一条的匹配之后,URL改变了,然后,将新的URL进行下一条规则的匹配,类似逻辑判断与运算。

#开启重写引擎
RewriteEngine On
RewriteBase /
RewriteRule ^(.*).htm$ $1.htas [C]
RewriteRule ^(.*).hta$ $1.ht [C]
RewriteRule ^(.*).ht$ $1.php [R=301]

apache 配置.htaccess实现伪静态 url重写

RewriteRule L flag说明

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

实例:

  根目录下有index.html,index.php,访问index.htm,因为匹配到了第一条规则,并且后面有L flag,所以不会匹配下面一条,类似编程逻辑或运算。

RewriteRule NE flag 说明

不对URL中的字符进行hexcode转码

RewriteRule ^(.*).htm$ $1.hta#index [R]

apache 配置.htaccess实现伪静态 url重写

 外部重定向,#会被转义

 添加NE标签,浏览器地址显示正常

#NE标签
RewriteRule ^(.*).htm$ $1.hta#index [R,NE]

apache 配置.htaccess实现伪静态 url重写

 RewriteRule NC flag说明

NC是指在匹配时,不区分大小写。因为在Apache本身对大小写是敏感的,

#NC标签
RewriteRule ^(.*).htm$ $1.hta#index [R,NE,NC]

apache 配置.htaccess实现伪静态 url重写

 RewriteRule G flag说明

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

#G标签
RewriteRule ^(.*).htm$ $1.hta#index [R,NE,NC,G]

apache 配置.htaccess实现伪静态 url重写

 RewriteRule QSA flag说明

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

规则不加QSA标签 http://r.com/aa.htm?a=b&b=c 
#QSA标签
RewriteRule ^(.*).htm$ $1.hta#index [R,NE,NC,QSA]

apache 配置.htaccess实现伪静态 url重写

Rewritecond-变量的使用
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php
#上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

RewriteCond %{REMOTE_HOST} ^test1.* [OR]
RewriteCond %{REMOTE_HOST} ^test2.* [OR]
RewriteCond %{REMOTE_HOST} ^test3.*
RewriteRule (.*)$ test.php
#上面语句的作用是如果你的地址是test1或test2或test3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。

Rewritecond-变量的使用



rewritecond-其他常用的判断条件
RewriteCond %{REQUEST_FILENAME} !-f //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)

RewriteCond %{REQUEST_FILENAME} !-d //#如果目录存在就直接访问目录不进行RewriteRule

RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite