为测试服务器添加URL重写功能

最近师傅给分配了一个为测试服务器添加URL重写功能的任务。

接到这个任务时有点蒙,因为以前根本没接触过服务器这部分知识,不知道为什么要重写URL,因为IIS本来就有URL重写功能啊。最后才理解了需求,因为这个测试服务器就相当于IIS服务器,而IIS重写URL是为了是URL容易记忆,或者是为了保护真实的路径信息等。而我这个任务其实也和IIS的URL重写功能类似。知道这点之后,就首先研究IIS的重写URL的规则了。

一、首先重写URL,必须先弄清楚URL的格式:

  URL的基本组成:协议类型+主机名+路径及文件名等

  协议:是指指定的传输协议,最常见的就是HTTP(超文本传输协议)。其他的有file 资源是本地计算机的文件,格式为file://

     ftp 通过ftp访问资源。格式为FTP://      https 通过安全的HTTPS访问资源。格式为HTTPS://  等等还有许多

  主机名:1.指存放资源的服务器的域名系统(DNS)或IP地址。有时,在主机名前也可以包含连接到服务器所需要的用户名和密码。2.端口号

  路径、参数、查询(用于给动态网页传递参数)   。。。。。

二、了解了URL的格式后,IIS的重写方式

IIS中的重写规则房子httpd.ini中,主要是通过正则表达式来进行匹配和替换的。因此首先对正则表达式要有一定的理解。

httpd.ini 中的规则格式: RewriteRule <url-pattern> <replacement-string>   [<modifiers>]

其中url-pattern 用来匹配的正则表达式(必须)

  replacement-string 顾名思义,替换的字符串(必须)

  modifiers:有关对RewriteRule的操作标记(可选选项)

下面以例子来说明:

 

RewriteRule <url-pattern> <replacement-string>   [<modifiers>]

 

url-pattern:匹配的正则表达式(必需)

 

replacement-string:要替换的字符串(必需)

 

modifiers:有关对RewriteRule的操作标记。可选选项。在下面我会说明

 

默认下IIRF的url-pattern,replacement-string正则的前面已经带了主机头的。
为了方便描述,直接看几个示例(以下示例基本全部来源IIRF文档)

 

例1

 

RewriteRule  ^/original/(.*).php  /modified/$1.aspx

 

源:http://xxx/original/index.php

 

目标:http://xxx/modified/index.aspx

 

例2

 

RewriteRule  ^/dinoch/album/([^/]+)/([^/]+).(jpg|JPG|PNG)   /chiesa/pics.aspx?d=$1&p=$2.$3

 

源:http://xxx/dinoch/album/30/1.jpg

 

目标:http://xxx/chiesa/pics.aspx?d=30&p=1.jpg

 

规则比较简单,主要是正则表达式的使用。比较复杂的就是modifiers:

1.[R]  or [R=code]

R = Redirect(URL跳转到<replacement-string>地址

重新改变浏览器的方向,跳转到新的指定的URL中。

[R=code]允许我们指定特定的HTTP状态返回码。只能介于301到399。如果超出这个范围。默认会是使用302状态。

RewriteRule ^/goto.aspx?r=(.*)$ $1 [R]

源:http://xxx/goto.aspx?r=http://www.google.com/

目标:http://www.google.com

2.[NF]

NF = Not found(返回404错误给用户,但该文件并未移除,还是保留在网站中)

它还可以跟RewriteCond一起配合,来实现自定义的404错误请求。特别要注意,你所要匹配的文件必须存在,替换的字符串不允许是存在文件名

RewriteRule ^/1008.aspx$ /1.aspx [NF]

1008.aspx文件需要存在,1.aspx不存在,否则无法正常达到我们的结果。

3.[L]

L = Last test if match(如果已经匹配,将不在继续匹配下去)

4.[F]

F = Forbidden(跟NF标志相似,)

5.[I]

I = Do case-insensitive matching 模糊匹配

6.[U]

U = Store original url in server Variable HTTP_X_REWRITE_URL(保存原始的url到HTTP_X_REWRITE_URL服务器变量中。)

    保存原始的url到HTTP_X_REWRITE_URL服务器变量中。在ASP.NET你可以用Request.ServerVariables["HTTP_X_REWRITE_URL"]获取原始值。

 

2.1.3.2  RewriteCond

 

RewriteCond <test-string> <pattern> [<modifier flag[,...]>]

类似于条件判断,并且允许多个条件,OR,AND。只有当RewriteCond的Server Variable 匹配所指定的正则表达,RewriteRule才会执行。比如:

RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)$

RewriteRule ^/(.*).aspx$ /$1.aspx

如果我们访问网站的地址的IP来源于127.0.0.1,那么,允许 RewriteRule ^/(.*).aspx$ /$1.aspx

RewriteCond %{REMOTE_ADDR} ^(127.0.0.1)$ [OR]

RewriteCond %{REMOTE_ADDR} ^(192.168.0.10)$

RewriteRule ^/(.*).aspx$ /$1.aspx

添加了OR来多个条件判断

RewriteCond %{REMOTE_ADDR}   ^(?!127.0.0.1)([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})(.*)$

RewriteRule  ^/(?!redirected.htm)(.*)$      /redirected.htm

Modifier flags有二个值

I=模糊匹配

OR=逻辑判断

    从IIRF的RewriteCond的功能上来说,确实很灵活另外。RewriteCond的[Patterns]可以带下面几个参数

-d

    Treats the TestString as a pathname and tests if it exists,and is a directory.

    TestString是一个路径名称,并且存在这个路径

-f

    Treats the TestString as a pathname and tests if it exists and is a regular file.

    TestString是一个路径名称,并且是一个存在的文件

-s

    Treats the TestString as a pathname and tests if it exists and is a regular file with size greater than zero.

    TestString 是一个路径名称,并且存在文件超过0字节

如文档所使用的例子

(1)RewriteCond %{HTTP_URL}                (/|\.htm|\.php|\.html|/[^.]*)$   [I] )

    如果URL是以htm,php,html(模糊匹配),

(2)RewriteCond %{REQUEST_FILENAME}                      !-f

    URL不是存在文件

(3)RewriteCond %{REQUEST_FILENAME}                      !-d

    URL不是请求的路径                                

(4)RewriteRule ^.*$                      /index.aspx                      [U,L]

     将所有请求跳转到index.aspx,保存原始的URL,之后不在对此进行匹配

再如,

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*

RewriteRule  ^/$                 /homepage.max.html  [L]

 

2.1.3.3  IIRF其它配置属性

 

IterationLimit {integer} 从指定的integer后开始匹配RewriteRule组。如果超出RewriteRule个数,默认将会从第8个开始。

MaxMatchCount {integer} RewriteRule组的总个数。

RewriteLog <filename stub> 日志路径。

RewriteLogLevel {0,1,2,3,4,5} 日志的等级。

 

转载于:https://www.cnblogs.com/unlike/archive/2012/09/09/2678048.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值