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

RewriteRule语法说明:

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

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

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

多个flag用逗号隔开

例子1

此时根目录只有index.htm,将所有访问 *.htm的请求都重定向到  *.html

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

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

如果在根目录创建一个index.html文件,再刷新的话,结果就不同了:

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

伪静态与重定向--RewriteRule的更多相关文章

  1. php伪静态与重定向

    什么是伪静态 伪静态是相对于真静态来讲的,伪静态只是改变了URL格式,实际还是动态页面,有真静态一样的SEO,真静态访问一个静态页面,服务器(apache,nginx)直接读取磁盘静态文件,伪静态是动 ...

  2. 新浪sae url rewrite(伪静态、重定向)详解

    新浪sae url rewrite(伪静态.重定向)详解 http://www.veryhuo.com phpclubs 2011-11-14 投递稿件 sae全程Sina App Engine,真是 ...

  3. 新浪SAE URLRewrite(伪静态、重定向)详解

    SAE全称Sina App Engine,真是一个好东西,他有很多优秀的特性,简单来说SAE就是一个简单高效的分布式Web服务开发.运行平台.支持现在常用的 PHP+Mysql 环境,在开发中难免会碰 ...

  4. 伪静态与重定向--RewriteBase

    RewriteBase用于设置目录级重写的基准URL,即所有的重定向都是基于这个URL.内部重定向可能看不出效果,但是在外部重定向(使用R flag后),如果不手动指定 / 为根目录,那么就会去整个磁 ...

  5. CodeIgniter_2 路由中定义伪静态 直接映射到相关的控制器

    某些情况下 隐藏路径信息 使用伪静态定义: RewriteRule ^no/torrent(.*)$ /index.php/torrent/doit/$1 CodeIgniter会自动识别到 no 控 ...

  6. PHPwind高级伪静态规则及方法

    phpwind iis下伪静态规则[ISAPI_Rewrite]RewriteRule ^(.*)/(.*)-htm-(.*)-(.*)\.html$ $1/$2\.php\?$3=$4Rewrite ...

  7. phpwind伪静态规则(IIS,Nginx,Apache)的介绍及代码

    phpwind iis下伪静态规则[ISAPI_Rewrite]RewriteRule ^(.*)/(.*)-htm-(.*)-(.*).html$ $1/$2.php?$3=$4RewriteRul ...

  8. Linux系统将http转为https

    想把网站由http访问转变为https访问并没有想象中那么难,网上查了一些资料,想要转为https需要SSL安全证书,这里推荐一款景安网络的证书,可以免费试用一年时间,自己拿来实践还是很不错的选择. ...

  9. ecshop 优化_将商品详情页goods.php重命名为shangpin.php

    有人说,将商品详情页的文件名 goods.php 改一个名字,对百度收录会有帮助,也许吧,这里不讨论是否有帮助,这里只讲解如何重命名. 例如:我们将 goods.php 改为 shangpin.php ...

随机推荐

  1. [USACO09JAN]安全出行Safe Travel

    题目 什么神仙题啊,我怎么只会\(dsu\)啊 我们考虑一个非常暴力的操作,我们利用\(dsu\ on \ tree\)把一棵子树内部的非树边都搞出来,用一个堆来存储 我们从堆顶开始暴力所有的边,如果 ...

  2. Qt5.7 + VS2015 环境搭建

    http://blog.csdn.net/liang19890820/article/details/53931813#安装插件 配置 Qt 5.7 选择:Qt VS Tools -> Qt O ...

  3. 在Debian系中快速有效的安装oracle-java

    jre8下载链接  https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html oracl ...

  4. JS进阶之---作用域,作用域链,闭包

    一.作用域: 在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找.这里的标识符,指的是变量名或者函数名. Ja ...

  5. SQL优化思路大全

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  6. CVE-2016-7912 分析报告

    CVE-2016-7912 背景介绍 在内核USB驱动中,进行异步读取或写入时,调用ki_complete(),会提前释放kiocb结构体,从而造成UAF漏洞,但经过分析,发现无法利用此漏洞进行攻击. ...

  7. 《Google软件测试之道》测试工程师

    愿和我一样读过这本书的人有所共鸣或者启发,愿没读过这本书的人,能获得一点点收获... 说到软件测试工程师,首先我们需要明白一个问题,软件测试工程师的职责是什么? 关于这个话题,不同的人有不同的定义:抛 ...

  8. async源码学习 - 控制流程waterfall函数

    waterfall函数会连续执行数组中的函数,每次通过数组下一个函数的结果.然而,数组任务中的任意一个函数结果传递失败,那么该函数的下一个函数将不会执行,并且主回调函数立马把错误作为参数执行. 以上是 ...

  9. 如何传递参数给ASP.NET Core的中间件(Middleware)

    问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...

  10. React-使用imutable.js来管理store中的数据

    reducer.js中store的数据是不能改变的,用原始的方法要手动的保证store不被修改,存在风险.imutable.js可以生成一个不可改变的对象,可以避免掉自己不小心修改掉store的情况. ...