rewriteWord文档格式.docx
- 文档编号:18317987
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:16
- 大小:24.70KB
rewriteWord文档格式.docx
《rewriteWord文档格式.docx》由会员分享,可在线阅读,更多相关《rewriteWord文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
(虚拟主机的配置可参考附录1)
学习基本的正则表达式;
在Apache的documentRoot内建议相关测试文件:
[root@localhosthtdocs]#pwd
/usr/local/apache/htdocs
[root@localhosthtdocs]#cat1.txt2.txttest/3.txt\
>
test/1.txt
thispage1
this'
spage2
spage3
spage11111111111111
设置windows宿主机的host文件,将以下域名进行解析:
192.168.118.131
第1页
【开启Rewrite功能】
4,打开httpd.conf,在全局配置中检查并添加下面的内容:
LoadModulerewrite_modulemodules/mod_rewrite.so
在虚拟主机内添加下面的内容
RewriteEngineon
RewriteCond%{HTTP_HOST}^a\.com
RewriteRule^(.*)$$1[R,L]
RewriteLog/root/rewrite.log
RewriteLogLevel3
尝试在浏览器内输入进行访问,如果url转跳到则说
明规则设置成功,同时在/root/rewrite.log里应该可以看到日志。
【入门级Rewrite功能】
5,目标:
将client请求的主机前缀不是和192.168.118.131
的都跳转到主机前缀为。
实际案例:
==》,==》
在虚拟主机中添加如下内容:
RewriteCond%{HTTP_HOST}!
^[NC]
^192.168.118.131
^$
实际效果:
输入都可直接访问;
==》;
==>
详细参数说明:
第2页
开启Rewrite功能
RewriteCond——定义重写发生的条件,可以理解为“筛选条件”
%{HTTP_HOST}——筛选条件为HTTP_HOST
!
^[NC]——非开头且不区分大小写
^$——HTTP_HOST非空
RewriteRule——为重写引擎定义重写规则,语法为:
RewriteRulePatternSubstitution[flags]
上文中的意思是将匹配过的信息转换成,$1意思是“正则表达式中的域/参数传递”
在本实验中,$1是匹配了前文中的^(.*)$中的()内的匹配内容,既“/1.txt”,
+$1就等于了。
[R]——强制重定向,[L]——立即停止重写操作,并不再应用其他重写规则。
日志存储位置和日志的记录等级(最高为8级)
TOP:
1)本测试中的Rewrite是在虚拟主机已经接到访问请求后才开始转换的,所以转化为
而非;
同理,其实RewriteCond中不必强调主机不为。
2)RewriteCond可以设置多个筛选条件,如上文,就是要符合四个筛选条件才发生转换。
RewriteRule也可以进行多次转换,“Pattern”既可以是初始的HTTP_HOST头信息,
也可以是经过上一轮转换处理过的结果,有兴趣的人可以试一下将RewriteRule改写为:
RewriteRule^(.*)$[R]
3)测试的时候注意标点为英文,还有该有空格的位置必须有空格
4)针对这些参数的详解可以看附录2中的链接——Rewrite模块参数详解。
6,移动DocumentRoot。
==》
在虚拟主机中更改Rewrite部分的设置:
RewriteRule^(.*)$$1[R]
RewriteCond%{REQUEST_URI}!
^/test/*
RewriteRule^/(.*)$/test/$1[R,L]
第一行的RewriteCond并没有改动,还保留第四步的状态。
而第二行的改动是将代表“立即
停止重写操作,并不再应用其他重写规则”的[L]去掉。
第三行用了一个新的“筛选条件”
“%{REQUEST_URI}”,具体的规则就是“!
^/test/*”,并非以/test/开头的路径
则执行第四行的操作:
^/(.*)$==》/test/$1,在域名和路径之间加上"
test/"
。
所以了,如果入门级正则都不太清楚的同学还是先去补习下正则吧。
第3页
请输入
具体的转化过程还要看日志,我们跟着rewrite日志一步一步来解释。
让我们来catrewrite.log,然后根据其中有代表性的记录来进行讲解:
因为输入的是,所以被第一条RewriteCond所匹配,这条3级日志没记录,但也应该清楚;
initrewriteenginewithrequesteduri/1.txt
马上就要开始重写请求的URI——/1.txt了。
applyingpattern'
^(.*)$'
touri'
/1.txt'
应用格式“'
”去匹配“'
”,肯定是能匹配成功了。
rewrite'
->
'
根据第二条的RewriteRule,把“1.txt”写到www.a里,其中$1='
='
explicitlyforcingredirectwith
确认了进行rewrite,==》
这里说明一下,因为满足第三行的RewriteCond,所以会应用一次第四行的重写规则;
^/(.*)$'
现在将'
去匹配'
escapingforredirect
让“
redirectto[REDIRECT/302]
重定做了“一个轮回”,
如果看不懂增加了www.的URL为什么仍然走了第三、第四条的匹配过程,请看附录3的分实验;
怎么会又应用了一次第二行的转换规则,而且还没有下文哪?
详情见附录4。
/test/1.txt'
完成匹配和转换,大功告成了,但是傻傻的apache还会再做次匹配……
initrewriteenginewithrequesteduri/test/1.txt
passthrough/test/1.txt
看上文你就知道为什么我需要在第三行的RewriteCond强调URI不能是/test/了,
实际试验中因为没加那个限定条件造成了死循环。
7,根据路径部分更改域名部分的测试。
最常见的就是访问某网站的“domain
这步的实验是
下文是更改过的rewrite功能,具体内容就不详解了,请根据5、6步的思路进行分析。
第4页
RewriteCond%{REQUEST_URI}^/test/*[NC]
RewriteRule^/test/(.*)$[NC,R,L]
【中级Rewrite功能】
8,从URL中提取部分信息进行重组。
举例一:
==>
举例二:
==>
举例三:
1)尝试将==》,尝试将==>
首先请编辑Winxp宿主机也就是http客户端的host文件,确保“”“”
这类奇怪的域名是可以解析的。
然后在虚拟主机a内加入如下内容:
RewriteRule^(.+)%{HTTP_HOST}[C]
RewriteRule^(.*)[NC,R,L]
第一个RewriteCond很简单,就是说开头的不解析,NC就是不区分大小写。
第一个RewriteRule^(.+)%{HTTP_HOST}[C]是一个典型应用,把用户输入完整的地址(GET方式的参数
除外)作为参数传给下一个规则。
日志的动作记录很清楚:
/'
'
但是对
这个典型应用我只知其然而不知其所以然,随时期望高手赐教。
[C]是Chain串联下一个规则的意思,
如果这一段能应用过去,才会应用下一段,如果无法应用该规则,则下一个RewriteRule也不会应用。
第二个RewriteRule就很简单了,考虑到实际应用中不大可能出现这样的疯子域名,可以
将正则从^(.*)改成^([^\.]+),当然用了这个域名之后1.txt就不可能被匹配成$1了,浏览器会出现“Bad
Request”错误。
针对此问题我曾经发帖求助,,详情见附录5.
2)尝试将
RewriteCond%{HTTP_HOST}^[NC]
RewriteCond%{REQUEST_URI}\.php$[NC]
RewriteRule^/(.*).php$http:
//$[NC,R,L]
3)尝试将1_转化成
RewriteRule^(.*)\_(.*txt)
uid=$1/abc/$2.php[NC,R,L]
PS:
做这三个实验只是为了证明apache的rewrite功能可以做XXX,而实际生活中应该遇不到这么怪诞的要求。
9,内部URL重定向。
举例:
数不胜数、不胜枚举了……那些给你们“个人个性域名的BLOG”大部分都是用的一个泛域名解析,然后一个
URL转跳满足你们的虚荣心的。
比如说和。
但是cublog和163blog又不
太一样。
cublog在输入域名后会转跳成
我无法猜测163用的啥技术,但我们使用内部url重定向,就可以达到163blog的效果。
目标:
==》
因为是“内部重定向”,所以从浏览器地址栏是看不出来测试结果的,我们需要先建立这些可以用浏览器浏览的文件。
[root@wwwhtdocs]#mkdirxiaowang;
mkdirxiaoli;
echo
"
zheshixiaowangdeindext"
>
xiaowang/index.txt;
echo"
zheshi
xiaolidelogin"
xiaoli/login.txt
然后把和加入winxp的host文件。
第5页
检查下虚拟主机的ServerAlias,确保主机可以接受前面几个域名。
ServerAlias*
在虚拟主机a中配置如下内容:
RewriteCond%{HTTP_HOST}^[^www]+$
首先要求HTTP头必须是,但不能是
RewriteRule^(.+)%{HTTP_HOST}$1[C]
参数传递,将整个url作为参数传递到下一个规则
RewriteRule^([^.]+)(.*)$
/usr/local/apache/htdocs/$1$2[L]
这一句是关键点,前面的^([^.]+)(.*)$好理解,只是把URI匹配了一下,后面的转换结果是本地路径,
且要是本地绝对路径,这样就是内部URL重定向。
10,在多个目录中搜索页面.
我一时想不起来什么情况下会用到这个功能,但这确实是个有意思的功能。
访问请为,首先尝试载入/a/1.txt,如果页面不存在则载入
/b/1.txt,如果页面仍然不存在则载入/c/1.txt;
如果都不匹配,则转到错误页面。
首先创建测试文件和文件夹:
mkdira;
mkdirb;
mkdirc;
a"
a/1.txt;
b"
b/1.txt;
c"
c/1.txt;
error"
error.html
虚拟主机中的转换规则如下(注,以更改html根目录为/web):
RewriteCond/web/a%{REQUEST_FILENAME}-f
RewriteRule^(.+)/web/a$1[L]
RewriteCond/web/b%{REQUEST_FILENAME}-f
RewriteRule^(.+)/web/b$1[L]
RewriteCond/web/c%{REQUEST_FILENAME}-f
RewriteRule^(.+)/web/c$1[L]
/error.html
RewriteRule^(.+)[L]
#RewriteRule!
^/error.html$[L]
{REQUEST_FILENAME}是一个变量,经过实际测试我发现和%{REQUEST_URI}意思差不多,此问题
我已发帖咨询http:
//bbs.linuxtone.org/thread-4212-1-1.html。
“-f”是将TestString
视为一个路径名并测试它是否为一个存在的常规文件,所以第一个RewriteCond的意思是检查
/web/a%{REQUEST_FILENAME},也就是/web/a/1.txt文件是否存在,如存在则进行下一步。
同
理,第二、第三个RewirteCond是检查下B/1.TXT或C/1.txt是否存在,而第四个则是为了防止死
循环,#号注释掉的部分可以用一条语句来替换掉上文中的两条防止死循环的设置。
11,根据时间进行不同的URL重定向。
又一个很有意思的功能,根据时间开进行诸如白天/夜间,工作时间/休息时间的页面切换。
访问
index_night.html。
通过此案例我们可以了解一些Rewrite模块数值运算的功能。
RewriteCond%{TIME_HOUR}%{TIME_MIN}>
0700
RewriteCond%{TIME_HOUR}%{TIME_MIN}<
1900
RewriteRule^/index.html$[L]
第6页
场景一:
凌晨三点访问index.html。
%{TIME_HOUR}%{TIME_MIN}=0300
RewriteCond第一步,0300>
0700不成立,则第一个RewriteRule不执行,执行第二个RewriteRule,index.
html==>
index_night.html;
然后
但在执行RewriteRule时,对方的匹配条件是^/index.html$,当前uri是/index_night.html,和
^/index.html$不匹配,所以也不转换。
场景二:
中午十二点半访问index.html,%{TIME_HOUR}%{TIME_MIN}=1230
RewriteCond第一步,1230>
0700成立,继续匹配;
RewriteCond第二步1230<
1900成立;
第一个RewriteRule
执行,执行index.htm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- rewrite