资讯专栏INFORMATION COLUMN

Apache Rewrite详解

OnlyMyRailgun / 2374人阅读

摘要:使用详解确认是否加载了模块启用修改为与学习需要重点了解它的三个核心,,。和是上下对应的关系。该字符串表明了访问该页面的用户代理的信息。当前请求的文件名写法和规则是配合一起使用,可以说,是成功匹配后的执行结果,所以,它是很重要的。

Rewrite的需求

在用Apache做web服务器的时候,有的时候需要将输入的URL转换成另一个URL这种需求。比如用CodeIgniter框架开发web应用的时候,我们访问的所有路径都要经过index.php,由这个index.php做统一路由,访问地址如下:

example.com/index.php/news/article/my_article

每次访问都带着index.php,实在太多余了,我们想要一个干净的地址如下:

example.com/news/article/my_article

这时你的 Apache 服务器需要启用mod_rewrite,然后简单的通过一个 .htaccess 文件再加上一些简单的规则就可以移除URL中的 index.php 了。下面是这个文件的一个例子, 其中使用了 "否定条件" 来排除某些不需要重定向的项目:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

在上面的例子中,除已存在的目录和文件,其他的 HTTP 请求都会经过你的 index.php 文件。也就是说单用户在地址栏里输入【example.com/news/article/my_article】的时候实际上访问的是【example.com/index.php/news/article/my_article】。

Rewrite使用详解  确认Apache是否加载了Rewrite模块

Apache2.x

LoadModule rewrite_module modules/mod_rewrite.so

启用.htaccess
AllowOverride None 修改为: AllowOverride All

RewriteCond 与 RewriteRule

学习Rewrite需要重点了解它的三个核心:RewriteEngine,RewriteCond,RewriteRule。

RewriteEngine

这个是rewrite功能的总开关,用来开启是否启动url rewrite

RewriteEngine on

RewriteCond

RewriteCond就是一个过滤条件,简单来说,当URL满足RewriteCond配置的条件的情况,就会执行RewriteCond下面紧邻的RewriteRule语句。

RewriteCond的格式如下:
RewriteCond %{NAME_OF_VARIABLE} REGX FLAG

举个例子:

RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteRule  index.php            index.m.php

如果设置上面的匹配规则,到来的http请求头中的HTTP_USER_AGENT匹配【^Mozilla//5/.0.*】正则表达式的话,则执行下面的RewriteRule,也就是说访问路径会跳转到 index.m.php这个文件。

RewriteCond 和 RewriteRule 是上下对应的关系。可以有1个或者好几个RewriteCond来匹配一个RewriteRule

那么RewriteCond可以匹配什么样的数据请求呢?

RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteCond %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteCond %{REQUEST_FILENAME} !-f

上面是常见的3种最常见使用最多的HTTP头连接与请求匹配。

HTTP_REFERER 当前请求页面的来源页面的地址

当前请求头中 User-Agent: 项的内容,如果存在的话。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0。

REQUEST_FILENAME 当前请求的文件名

RewriteRule 写法和规则

RewriteRule是配合RewriteCond一起使用,可以说,RewriteRule是RewriteCond成功匹配后的执行结果,所以,它是很重要的。

RewriteRule的格式

RewriteRule Pattern Substitution [flags]

Pattern是一个正则匹配。Substitution是匹配的替换 [flags]是一些参数限制;

举几个栗子:

RewriteRule ^room/video/(d+).html web/index.php?c=room&a=video&r=$1 [QSA,NC,L]

意思是以 room开头的 room/video/123.html 这样子,变成 web/index.php?c=room&a=video&r=123

RewriteRule .(jpg|gif) http://image.baidu.com/ [R,NC,L]

意思是以为是访问.jpg或者gif的文件,都会调整到 http://image.baidu.com

从上面看出,掌握Rewrite,学习正则表达式是关键所在。

我们再看看[flags]是什么意思?

因为它太多了。我就挑几个最常用的来说说。

[QSA] qsappend(追加查询字符串)的意思,次标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。上面那个room的例子,就必须用它。

[NC] nocase(忽略大小写)的意思,它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,"A-Z"和"a-z"没有区别。这个一般也会加上,因为我们的url本身就不区分大小写的。

[R] redirect(强制重定向)的意思,适合匹配Pattern后,Substitution是一个http地址url的情况,就定向出去了。上面那个定向到image.baidu.com的例子,就必须也用它。

[L] last(结尾规则)的意思,就是已经匹配到了,就立即停止,不再匹配下面的Rule了,类似于编程语言中的break语法,跳出去了。

参考

apache的虚拟域名rewrite配置以及.htaccess的使用。
Apache的Rewrite详解

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/35977.html

相关文章

  • Apache Rewrite详解

    摘要:使用详解确认是否加载了模块启用修改为与学习需要重点了解它的三个核心,,。和是上下对应的关系。该字符串表明了访问该页面的用户代理的信息。当前请求的文件名写法和规则是配合一起使用,可以说,是成功匹配后的执行结果,所以,它是很重要的。 Rewrite的需求 在用Apache做web服务器的时候,有的时候需要将输入的URL转换成另一个URL这种需求。比如用CodeIgniter框架开发web应...

    刘福 评论0 收藏0
  • 【nginx运维基础(6)】Nginx的Rewrite语法详解

    概述 重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力;而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;它还可以提高你的网站的安全性;而且通常会让你的网站更加便于使用和更专业。 Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中r...

    Yang_River 评论0 收藏0
  • ubuntu搭建PHP网站完整实例教程

    摘要:一般情况下,经过上面的步骤之后,网站基本上可以搭建成功。当然,在日常的实际操作中,可能还会有一些意想不到的情况发生,到时候就考验我们解决问题的能力了。参考文章添加用户删除用户与授权设置远程访问的指令详解的详解 原文是在我自己博客中,小伙伴也可以点阅读原文进行跳转查看,还有好听的背景音乐噢~ showImg(https://segmentfault.com/img/remote/1460...

    Forelax 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<