Apache rewrite规则

本文介绍了Apache服务器中URL重写的Rewrite模块配置方法,包括服务器级与目录级配置,及如何通过正则表达式实现特定域名到目标域名的跳转。
1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。
基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
2、举例说明:
下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.colorme.com和203.81.23.202都跳转到主机前缀为http://www.colorme.com.cn,避免当用户在地址栏写入http://colorme.com.cn时不能以会员方式登录网站。
[color=green]NameVirtualHost 192.168.100.8:80
<VirtualHost 192.168.100.8:80>
ServerAdmin webmaster@colorme.com.cn
DocumentRoot "/web/webapp"
ServerName www.colorme.com.cn
ServerName colorme.com.cn
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.colorme.com.cn [NC][/color] #声明Client请求的主机中前缀不是www.colorme.com.cn,[NC]的意思是忽略大小写
[color=green]RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] [/color]#声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写
[color=green]RewriteCond %{HTTP_HOST} !^$[/color] #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写
[color=green]RewriteRule ^/(.*) http://www.colorme.com.cn/ [L][/color] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.colorme.com.cn/, [L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。
[color=green]</VirtualHost>[/color]
### Apache Rewrite规则实战 #### 实战案分析 当处理URL重写需求时,Apache的`mod_rewrite`模块提供了强大的功能来实现复杂的URL转换。通过配置`.htaccess`文件或主配置文件中的指令集,可以灵活控制HTTP请求的行为。 对于具体的应用场景,考虑一个简单的子:假设有一个网站希望将旧版本页面路径 `/old/path/to/resource.html` 转向至新结构下的对应位置 `/new/path/to/resource.php` 。这可以通过定义一条基本的 `RewriteRule` 来完成: ```apache RewriteEngine On RewriteBase / RewriteRule ^old/path/to/(.*)\.html$ /new/path/to/$1.php [R=301,L] ``` 此段代码首先启用了重写引擎并设定了基础目录;接着利用正则表达式模式匹配任何以 `.html` 结尾位于指定子路径内的资源,并将其永久性地(状态码301)转向到新的PHP脚本地址[^1]。 #### 复杂条件判断与变量应用实 更进一步,在某些情况下可能需要基于查询字符串或其他环境因素决定如何处理请求。如,下面的子展示了如何根据特定参数的存在与否执行不同的动作: ```apache RewriteCond %{QUERY_STRING} ^t/=(.+)?$ [NC] RewriteRule ^/api$ http://www.sina.com.cn?t=%1 [P] ``` 这里使用了 `%{QUERY_STRING}` 变量检测 URL 中是否含有形如 `t/=value` 的查询项。如果存在,则会代理转发给新浪网的服务接口,并传递原始参数值作为附加信息[^2]。 #### 完整流程验证 为了确保配置生效,通常还需要测试整个过程。比如在一个虚拟主机环境中模拟域名解析指向本地服务器后,尝试访问预设的目标站点链接 `http://www.rewrite.rewrite.com` ,观察浏览器返回的结果是否符合预期 —— 即被正确引导到了目标域 `http://www.rewrite.com` 并带有临时跳转的状态码 302[^3]。 #### 参数化路由映射示 最后来看一个涉及多级动态参数的情况: ```apache RewriteRule ^/([0-9]+)/yunan/(.+)$ /index.php?tid=$1&items=$2 [L,R=301] ``` 这条规则能够捕获两个部分的数据片段分别赋值给 PHP 文件里的 GET 请求参数 `tid` 和 `items`,从而实现了从静态外观风格的 URL 到实际应用程序内部逻辑之间的无缝过渡[^4]。 #### 高级特性运用 除了上述常规用途外,还可以借助于各种标志位增强灵活性。如,采用不区分大小写的比较方式 (`nocase|NC`) 或者允许后续条件继续评估(`ornext|OR`)等选项来构建更加精细的选择机制[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值