利用apache的mod_rewrite做URL规则重写

简介: 使用mod_rewrite做url重写,伪静态,做过很多次,这次用几个例子记下来,便于后面查用。使用方法: 1.在conf目录的httpd.conf文件中找到:           LoadModule rewrite_module modules/mod_rewrite.

使用mod_rewrite做url重写,伪静态,做过很多次,这次用几个例子记下来,便于后面查用。

使用方法:

 1.在conf目录的httpd.conf文件中找到:

           LoadModule rewrite_module modules/mod_rewrite.so

 

2.在要支持url rewirte的目录启用 Options FollowSymLinks和AllowOverride All

  <Directory "D:/WAMP/Mypro/">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>

这样通过http://localhost/Mypro/访问时,/Mypro/和其下面的子目录将支持url rewrite。

3.在Mypro根目录下添加.htaccess文件,添加规则:

RewriteEngine on

 

#针对phpcms的url结构

RewriteRule ^content-([0-9]+)-([0-9]+)-([0-9]+).html index.php?m=content&c=index&a=show&catid=$1&id=$2&page=$3

-----------------------------

下面给三个浅显易懂的例子:

<1>


RewriteEngine on
RewriteCond $1 !(index.php|images)
RewriteRule ^(.*)$ /index.php?page=$1 [L]

 

RewriteEngine on:开启Rewrite

RewriteCond $1 !(index.php|images):如果文件不为index.php或目录不为images。

RewriteRule ^(.*)$ /index.php?page=$1:转给index.php处理。

$1代表引用RewriteRule中的第一个正则(.*)代表的字符。RewriteCond中的正则很普通,所以不做说明。RewriteRule中的正则,(.*)代表任意字符,^是开始锚,$是结束锚。

设置之后,当访问dmyz.org/about时,实际是访问dmyz.org/index.php?page=about,从url中省略掉了index.php。这一规则经常用于框架开发环境,因为大多数框架都是将所有的请求提交给一个入口文件(通常是index.php)来处理的。

将第三行修改:

RewriteRule ^(.*).htm$ /index.php?page=$1

访问dmyz.org/about.htm时实际访问的仍然是dmyz.org/index.php?page=about,这就实现简单的伪静态了。

------------------------------

<2>

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /.htm

用这个简单的例子来说明重写条件(RewriteCond)使用的服务器变量和特殊正则。

%{REQUEST_FILENAME}获得一个服务器变量的值,!-f是正则,其中感叹号表否定,-f用来检测当前值所代表的路径是否是一个常规文件。因此例2实现的是:当访问的文件不是一个常规文件时,转到404.htm页面。这就是一个简单的用Rewrite实现404页面重定向的例子。还可以补充一下,将其修改为:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
#如果当前变量所代表的路径不是一个常规目录
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /.htm

------------------------------

<3>

RewriteEngine on
RewriteCond %{QUERY_STRING} ^pageid=(.*)?$ [NC]
RewriteRule ^index(.*)$ http://dmyz.org/thread.php?fid=%1 [R=,L]

本例中使用了配置指令,和重写规则对重写条件的引用。

如例2所说,重写条件可以使用服务器变量和特殊正则,但重写规则不可以。所以需要在重写规则中反向引用重写条件的内容。例3中使用%1来反向引用(.*)?。当查询字符串为pageid=任意字符串时,跳转到thread.php?fid=任意字符串。这条正则很适合网站搬家、更换程序后,将原地址转向到新地址。

前两个例子,重写条件和重写规则都只有两个参数——正则和字符串,本例中追加第三个参数,它被称为标识,跟在重写条件和重写规则之后的,作为辅助、补充之用。本例中使用了最简单三个标识:

[NC]:忽略大小写。

[L]:结尾标识。停止重写操作,并不再应用其他重写规则。防止本条规则被后续规则影响。

[R=301]:利用HTTP 301跳转。

----------------------------------------------------

一个常见的问题:配置完rewrite后有时会显示Forbidden  You don't have permission to access /Mypro/blog/ on this server.这样的错误。

加上Options FollowSymLinks就行了,注意不能加Indexes,这个表示显示目录(根目录没有index.html的情况下就显示文件夹的目录结构)。

实际上mod_rewrite是针对目录的,因此并不需要将httpd.conf中的所有AllowOverride None改为AllowOverride All,Options也一样。

 

目录
相关文章
|
7月前
|
Web App开发 编解码 运维
LNMP详解(十二)——Nginx URL重写实战
LNMP详解(十二)——Nginx URL重写实战
75 2
|
前端开发 应用服务中间件 API
Nginx 反向代理 去除 路径匹配规则url
Nginx 反向代理 去除 路径匹配规则url
|
3月前
|
Apache
多应用模式下,忽略项目的入口文件,重写Apache规则
本文介绍了在多应用模式下,如何通过编辑Apache的.htaccess文件来重写URL规则,从而实现忽略项目入口文件index.php进行访问的方法。
|
6月前
|
应用服务中间件 Apache nginx
apache、nginx开启rewrite重写服务及伪静态
apache、nginx开启rewrite重写服务及伪静态
323 4
|
7月前
|
开发框架 搜索推荐 中间件
中间件应用路由和URL重写
【5月更文挑战第2天】中间件应用路由和URL重写
55 3
中间件应用路由和URL重写
|
7月前
|
编解码 运维 搜索推荐
LNMP详解(十一)——Nginx URL重写原理
LNMP详解(十一)——Nginx URL重写原理
58 0
|
7月前
|
JavaScript Windows
VUE部署到IIS中报404错误解决方案-配置URL重写
VUE部署到IIS中报404错误解决方案-配置URL重写
312 0
|
iOS开发
解决alert在ios版微信中显示url的问题(重写alert)
解决alert在ios版微信中显示url的问题(重写alert)
117 0
|
Dubbo 应用服务中间件 测试技术
带你读《Apache Dubbo微服务开发从入门到精通》—— 三、 标签路由规则
带你读《Apache Dubbo微服务开发从入门到精通》—— 三、 标签路由规则
236 5
|
Dubbo 应用服务中间件 Apache
带你读《Apache Dubbo微服务开发从入门到精通》—— 二、 条件路由规则
带你读《Apache Dubbo微服务开发从入门到精通》—— 二、 条件路由规则
192 6

热门文章

最新文章

推荐镜像

更多