apache 配置.htaccess实现伪静态 url重写
文章转载自:
https://www.cnblogs.com/-beyond/p/8325144.html
https://blog.csdn.net/expleeve/article/details/6621885/
图-1:重写规则集中的控制流
使用apache伪静态需要修改apache配置文件,开启Rewrite重写模块
#开启重写引擎 RewriteEngine On
1.RewriteRule 根据匹配规则,重写url
RewriteRule语法说明:
RewriteRule 模式匹配 替换的URL [flags]
内部重定向
#开启重写引擎 RewriteEngine On
#内部重定向
#RewriteRule ^(.*)\.htm$ $1.
使用内部重定向浏览器地址不会发生变化
外部重定向
#开启重写引擎 RewriteEngine On
#R参数-外部重定向 301永久重定向,对搜索引擎友好,302临时重定向
RewriteRule ^(.*)\.hta$ $1.html [R=301]
外部重定向利用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]
RewriteRule L flag说明
如果一条规则的后面添加了这个L flag,那么如果这条规则匹配,就不在进行下一条规则的匹配,如果改规则不匹配,则会继续进行下一规则的匹配。
实例:
根目录下有index.html,index.php,访问index.htm,因为匹配到了第一条规则,并且后面有L flag,所以不会匹配下面一条,类似编程逻辑或运算。
RewriteRule NE flag 说明
不对URL中的字符进行hexcode转码
RewriteRule ^(.*)\.htm$ $1.hta#index [R]
外部重定向,#会被转义
添加NE标签,浏览器地址显示正常
#NE标签
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE]
RewriteRule NC flag说明
NC是指在匹配时,不区分大小写。因为在Apache本身对大小写是敏感的,
#NC标签
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE,NC]
RewriteRule G flag说明
表示请求的网页已经失效(对应响应码的410),并且停止后续规则的匹配
#G标签
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE,NC,G]
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]
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