rewrite

我的Rewrite 测试【作业环境】1,服务器端:基于Redhat5的apache2.2.10;使用NAT 联网的VMware 虚拟机[root@localhost conf]# uname -aLi

我的Rewrite 测试

【作业环境】

1,服务器端:

基于Redhat5的apache2.2.10;

使用NAT 联网的VMware 虚拟机

[root@localhost conf]# uname -a

Linux localhost.localdomain 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 i686 i386 GNU/Linux

[root@localhost conf]# pwd

/usr/local/apache/conf

[root@localhost conf]# ../bin/httpd -v

Server version: Apache/2.2.10 (Unix)

Server built: Dec 11 2008 23:30:45

2,客户端:

Windows XP,同时也是虚拟机的宿主机;

浏览器使用Opera 10,使用Vmware 的NAT 网络连接到虚拟机

【初始设置】

3,编译安装apache ,编译的时候把Mod_rewrite打开;

安装完成后启用apache ,确认可以在浏览器里show 出来“It's Work。” 然后添加www.a.com(alias a.com)www.b.com 和www.aaa.com 三个虚拟主机 (虚拟主机的配置可参考附录1)

学习基本的正则表达式;

在Apache 的documentRoot 内建议相关测试文件:

[root@localhost htdocs]# pwd

/usr/local/apache/htdocs

[root@localhost htdocs]# cat 1.txt 2.txt test/3.txt > test/1.txt

this page 1

this's page 2

this's page 3

this's page 11111111111111

设置windows 宿主机的host 文件,将以下域名进行解析: 192.168.118.131 www.a.com

192.168.118.131 a.com

192.168.118.131 www.b.com

192.168.118.131 www.aaa.com

第 1 页

我的Rewrite 测试

【开启Rewrite 功能】

4,打开httpd.conf ,在全局配置中检查并添加下面的内容:

,

LoadModule rewrite_module modules/mod_rewrite.so

在虚拟主机www.a.com 内添加下面的内容

RewriteEngine on

RewriteCond {HTTP_HOST} ^a.com

RewriteRule ^(.*)$ http://www.a.com$1 [R,L]

RewriteLog /root/rewrite.log

RewriteLogLevel 3

尝试在浏览器内输入a.com 进行访问,如果url 转跳到www.a.com 则说 明规则设置成功,同时在/root/rewrite.log里应该可以看到日志。

【入门级Rewrite 功能】

5,目标:将client 请求的主机前缀不是www.a.com 和192.168.118.131 的都跳转到主机前缀为http://www.b.com。

实际案例:sohu.com ==》www.sohu.com ,bbs.sohu.com ==》club.sohu.com

在虚拟主机www.b.com 中添加如下内容:

RewriteEngine on

RewriteCond {HTTP_HOST} !^www.b.com [NC]

RewriteCond {HTTP_HOST} !^www.a.com [NC]

RewriteCond {HTTP_HOST} !^192.168.118.131

RewriteCond {HTTP_HOST} !^$

RewriteRule ^(.*)$ http://www.b.com$1 [R,L]

RewriteLog /root/rewrite.log

RewriteLogLevel 3

在虚拟主机www.aaa.com 中添加如下内容:

RewriteEngine on

RewriteCond {HTTP_HOST} !^www.a.com [NC]

RewriteCond {HTTP_HOST} !^192.168.118.131

RewriteCond {HTTP_HOST} !^$

RewriteRule ^(.*)$ http://www.b.com$1 [R,L]

RewriteLog /root/rewrite.log

RewriteLogLevel 3

实际效果:输入www.a.com www.b.com都可直接访问;

a.com==》www.a.com;www.aaa.com==>www.b.com

详细参数说明:

RewriteEngine on

第2页

我的Rewrite 测试

开启Rewrite 功能

RewriteCond {HTTP_HOST} !^www.b.com [NC]

RewriteCond ——定义重写发生的条件,可以理解为“筛选条件”

{HTTP_HOST}——筛选条件为HTTP_HOST

!^www.b.com [NC]——非www.b.com 开头且不区分大小写

RewriteCond {HTTP_HOST} !^www.a.com [NC]

,

RewriteCond {HTTP_HOST} !^192.168.118.131

RewriteCond {HTTP_HOST} !^$

!^$——HTTP_HOST非空

RewriteRule ^(.*)$ http://www.b.com$1 [R,L]

RewriteRule ——为重写引擎定义重写规则,语法为:

RewriteRule Pattern Substitution [flags]

上文中的意思是将匹配过的信息转换成www.b.com ,$1意思是“正则表达式中的域/参数传递” 在本实验中,$1是匹配了前文中的^(.*)$中的()内的匹配内容,既“/1.txt”, http://www.b.com $1 就等于 http://www.b.com/1.txt 了。

[R]——强制重定向,[L]——立即停止重写操作,并不再应用其他重写规则。

RewriteLog /root/rewrite.log

RewriteLogLevel 3

日志存储位置和日志的记录等级(最高为8级)

TOP :

1)本测试中的Rewrite 是在虚拟主机已经接到访问请求后才开始转换的,所以a.com 转化为 www.a.com 而非www.b.com ;同理,其实RewriteCond 中不必强调主机不为www.a.com 。

2)RewriteCond 可以设置多个筛选条件,如上文,就是要符合四个筛选条件才发生转换。 RewriteRule 也可以进行多次转换,“Pattern ”既可以是初始的HTTP_HOST头信息, 也可以是经过上一轮转换处理过的结果,有兴趣的人可以试一下将RewriteRule 改写为: RewriteRule ^(.*)$ http://www.b.com [R]

RewriteRule ^(.*)$ http://www.a.com$1 [R,L]

3)测试的时候注意标点为英文,还有该有空格的位置必须有空格

4)针对这些参数的详解可以看附录2中的链接——Rewrite 模块参数详解。

6,移动DocumentRoot 。www.a.com==》www.a.com/test

在虚拟主机www.a.com 中更改Rewrite 部分的设置:

RewriteCond {HTTP_HOST} ^a.com

RewriteRule ^(.*)$ http://www.a.com$1 [R]

RewriteCond {REQUEST_URI} !^/test/*

RewriteRule ^/(.*)$ /test/$1 [R,L]

第一行的RewriteCond 并没有改动,还保留第四步的状态。而第二行的改动是将代表“立即 停止重写操作,并不再应用其他重写规则”的[L]去掉。第三行用了一个新的“筛选条件” “ {REQUEST_URI} ”,具体的规则就是 “!^/test/*” ,并非以/test/开头的路径 则执行第四行的操作:^/(.*)$ == 》/test/$1,在域名和路径之间加上"test/"。 所以了,如果入门级正则都不太清楚的同学还是先去补习下正则吧。

第3页

我的Rewrite 测试

请输入a.com/1.txt,如果正确转换www.a.com/test/1.txt,则说明测试成功。

具体的转化过程还要看日志,我们跟着rewrite 日志一步一步来解释。

让我们来cat rewrite.log,然后根据其中有代表性的记录来进行讲解:

因为输入的是a.com ,所以被第一条RewriteCond 所匹配,这条3级日志没记录,但也应该清楚; init rewrite engine with requested uri /1.txt

马上就要开始重写请求的URI ——/1.txt了。

,

applying pattern '^(.*)$' to uri '/1.txt'

应用格式“ '^(.*)$'”去匹配“'/1.txt'”,肯定是能匹配成功了。

rewrite '/1.txt' -> 'http://www.a.com/1.txt'

根据第二条的RewriteRule ,把“1.txt ”写到www.a 里,其中 $1= '^(.*)$' = '/1.txt'。 explicitly forcing redirect with http://www.a.com/1.txt

确认了进行rewrite ,a.com/1.txt ==》 www.a.com/1.txt;

这里说明一下,因为满足第三行的RewriteCond ,所以会应用一次第四行的重写规则; applying pattern '^/(.*)$' to uri 'http://www.a.com/1.txt' 现在将'^/(.*)$'去匹配 'http://www.a.com/1.txt'

escaping http://www.a.com/1.txt for redirect

让“ http://www.a.com/1.txt”避开重定向。

redirect to http://www.a.com/1.txt [REDIRECT/302]

重定做了“一个轮回”,a.com/1.txt变成了www.a.com/1.txt

如果看不懂增加了www. 的URL 为什么仍然走了第三、第四条的匹配过程,请看附录3的分实验; init rewrite engine with requested uri /1.txt

applying pattern '^(.*)$' to uri '/1.txt'

怎么会又应用了一次第二行的转换规则,而且还没有下文哪?详情见附录4。

applying pattern '^/(.*)$' to uri '/1.txt'

rewrite '/1.txt' -> '/test/1.txt'

explicitly forcing redirect with http://www.a.com/test/1.txt

escaping http://www.a.com/test/1.txt for redirect

redirect to http://www.a.com/test/1.txt [REDIRECT/302]

完成匹配和转换,大功告成了,但是傻傻的apache 还会再做次匹配„„

init rewrite engine with requested uri /test/1.txt

applying pattern '^(.*)$' to uri '/test/1.txt'

applying pattern '^/(.*)$' to uri '/test/1.txt'

pass through /test/1.txt

看上文你就知道为什么我需要在第三行的RewriteCond 强调URI 不能是/test/了, 实际试验中因为没加那个限定条件造成了死循环。

7, 根据路径部分更改域名部分的测试。最常见的就是访问某网站的“domain name.com/bbs”的时候转到“bbs.domainname.com ”。

这步的实验是a.com/test/1.txt==》www.a.com/1.txt

下文是更改过的rewrite 功能,具体内容就不详解了,请根据5、6步的思路进行分析。

第4页

我的Rewrite 测试

RewriteCond {HTTP_HOST} !^www.a.com [NC]

RewriteCond {REQUEST_URI} ^/test/* [NC]

RewriteRule ^/test/(.*)$ http://www.a.com/$1 [NC,R,L]

【中级Rewrite 功能】

8,从URL 中提取部分信息进行重组。

举例一:www.sysinternals.com/ ==>> technet.microsoft.com/zh-cn/sysinternals/default.aspx 举例二: user.qzone.qq.com/12345678 ==>> 12345678.user.qzone.qq.com

,

举例三:12345678.user.qzone.qq.com ==>> user.qzone.qq.com/12345678

1)尝试将a.www.a.com==》www.a.com/a ,尝试将1.txt.www.a.com ==>> www.a.com/1.txt 首先请编辑Winxp 宿主机也就是http 客户端的host 文件,确保“a.www.a.com ”“1.txt.www.a.com ”

这类奇怪的域名是可以解析的。然后在虚拟主机a 内加入如下内容:

RewriteCond {HTTP_HOST} !^www.a.com [NC]

RewriteRule ^(. ) {HTTP_HOST} [C]

RewriteRule ^(.*).www.a.com http://www.a.com/$1 [NC,R,L]

第一个RewriteCond 很简单,就是说www.a.com 开头的不解析,NC 就是不区分大小写。

第一个RewriteRule ^(. ) {HTTP_HOST} [C] 是一个典型应用,把用户输入完整的地址(GET 方式的参数

除外)作为参数传给下一个规则。日志的动作记录很清楚:rewrite '/' -> '1.txt.www.a.com'。但是对

这个典型应用我只知其然而不知其所以然,随时期望高手赐教。[C]是Chain 串联下一个规则的意思,

如果这一段能应用过去,才会应用下一段,如果无法应用该规则,则下一个RewriteRule 也不会应用。

第二个RewriteRule 就很简单了,考虑到实际应用中不大可能出现1.txt.www.a.com 这样的疯子域名,可以

将正则从^(.*)改成^([^.] ),当然用了这个域名之后1.txt 就不可能被匹配成$1了,浏览器会出现“Bad

Request ”错误。

针对此问题我曾经发帖求助,,详情见附录5.

2)尝试将www.a.com/1.php转化1.txt.www.a.com;

RewriteCond {HTTP_HOST} ^www.a.com [NC]

RewriteCond {REQUEST_URI} .php$ [NC]

RewriteRule ^/(.*).php$ http://$1.txt.www.a.com [NC,R,L]

3) 尝试将1_23txt.www.a.com转化成 www.a.com/uid=1/abc/23txt.php

RewriteCond {HTTP_HOST} !^www.a.com [NC]

RewriteRule ^(. ) {HTTP_HOST} [C]

RewriteRule ^(.*)_(.*txt).www.a.com http://www.a.com/

uid=$1/abc/$2.php [NC,R,L]

PS:做这三个实验只是为了证明apache 的rewrite 功能可以做XXX ,而实际生活中应该遇不到这么怪诞的要求。 9,内部URL 重定向。

举例:数不胜数、不胜枚举了„„那些给你们“个人个性域名的BLOG ”大部分都是用的一个泛域名解析,然后一个 URL 转跳满足你们的虚荣心的。比如说xxx.blog.163.com 和xxx.cublog.com 。但是cublog 和163blog 又不

太一样。cublog 在输入域名后会转跳成blog.chinaunix.net/u1/UID/,而163的blog 始终显示是xxx.blog.

163.com 。我无法猜测163用的啥技术,但我们使用内部url 重定向,就可以达到163blog 的效果。

目标:xiaoli.a.com/index.txt ==》www.a.com/xiaoli/index.txt

xiaowang.a.com/login.txt ==》www.a.com/xiaowang/login.txt

因为是“内部重定向”,所以从浏览器地址栏是看不出来测试结果的,我们需要先建立这些可以用浏览器浏览的文件。

[root@www htdocs]# mkdir xiaowang; mkdir xiaoli;echo

"zheshixiaowangdeindext" >>xiaowang/index.txt;echo "zheshi

xiaolidelogin" >>xiaoli/login.txt

然后把xiaoli.a.com 和xiaowang.a.com 加入winxp 的host 文件。

第5页

我的Rewrite 测试

检查下虚拟主机的 Server Alias,确保主机可以接受前面几个域名。

ServerAlias a.com *.a.com

,

在虚拟主机a 中配置如下内容:

RewriteEngine on

RewriteCond {HTTP_HOST} ^[^www] .a.com$

首先要求HTTP 头必须是xxxxxx.a.com ,但不能是www.a.com

RewriteRule ^(. ) {HTTP_HOST}$1 [C]

参数传递,将整个url 作为参数传递到下一个规则

RewriteRule ^([^.] ).a.com(.*)$

/usr/local/apache/htdocs/$1$2 [L]

这一句是关键点,前面的^([^.] ).a.com(.*)$ 好理解,只是把URI 匹配了一下,后面的转换结果是本地路径, 且要是本地绝对路径,这样就是内部URL 重定向。

10, 在多个目录中搜索页面.

我一时想不起来什么情况下会用到这个功能,但这确实是个有意思的功能。

目标:访问请为www.a.com/1.txt ,首先尝试载入/a/1.txt,如果页面不存在则载入

/b/1.txt,如果页面仍然不存在则载入/c/1.txt;如果都不匹配,则转到错误页面。

首先创建测试文件和文件夹:

mkdir a ;mkdir b;mkdir c;echo "a">a/1.txt;

echo "b">b/1.txt;echo "c">c/1.txt;echo "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]

RewriteCond {REQUEST_URI} !/error.html

RewriteRule ^(. ) http://www.a.com/error.html [L]

#RewriteRule !^/error.html$ http://www.a.com/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 重定向。

又一个很有意思的功能,根据时间开进行诸如白天/夜间,工作时间/休息时间的页面切换。

目标:访问www.a.com/index.html,7-19点转跳到index_day.html,其他时间则转跳

index_night.html。通过此案例我们可以了解一些Rewrite 模块数值运算的功能。 RewriteCond {TIME_HOUR}{TIME_MIN} >0700

RewriteCond {TIME_HOUR}{TIME_MIN} <1900

RewriteRule ^/index.html$ http://www.a.com/index_day.html [L]

RewriteRule ^/index.html$ http://www.a.com/index_night.html [L] 第6页

,

我的Rewrite 测试

场景一:凌晨三点访问index.html 。{TIME_HOUR}{TIME_MIN}=0300

RewriteCond 第一步,0300>0700不成立,则第一个RewriteRule 不执行,执行第二个RewriteRule ,index. html==>index_night.html;然后www.a.com/index_night.html回炉重新进行匹配,RewriteCond 部分照旧, 但在执行RewriteRule 时,对方的匹配条件是^/index.html$,当前uri 是/index_night.html,和 ^/index.html$不匹配,所以也不转换。

场景二:中午十二点半访问index.html ,{TIME_HOUR}{TIME_MIN}=1230

RewriteCond 第一步,1230>0700成立,继续匹配;RewriteCond 第二步1230<1900成立;第一个RewriteRule 执行,执行index.html==>index_day.html。如果不加[L],则继续执行第二个RewriteRule ,但^/index. html$和index_day.html不匹配,也要从头重新开始匹配;如果加上[L],则直接跳回开头进行匹配。第二轮 匹配的时候还是会因为^/index.html$和index_day.html不匹配退出Rewrite 。

场景三:晚上九点一刻访问index.html ,{TIME_HOUR}{TIME_MIN}=2115

RewriteCond 第一步2115>0700成立,但第二步2115<1900不成立,所以不执行第一个RewriteRule ,而第二个 RewriteRule 执行时^/index.html$匹配/index.html,可以正常执行。转换完成后进行必然是徒劳无功的第 二轮Rerwrite 过程。

Top :可以在最前面加一个RewriteCond {REQUEST_URI} ^/index.html$来跳过第二轮的RewriteRule , 但相应的也会增加两次RewriteCond 。如何效率更高一些,大家见仁见智。

12,利用Rewrite 阻止一类盗链请求。

什么是盗链、盗链的危害这类话就不说了,直接切入正题。

在这个测试中,我们筛选盗链是根据HTTP 访问请求中的HTTP_REFERER变量来判断是否该拒绝这个请求的。 这次盗链发生在同一个apache 的两个虚拟主机之间,经过同高手们确认,这样做测试也是可行的。 首先,一般架站、编写网页的时候,图片、音频、视频这类文件都会有专门的文件夹进行存放,也方便管理。 所以我们首先在apache 服务器的DocumentRoot 目录下新建个image 的目录,并把a.jpg 和error.jpg 都丢进去。 然后,我们要写如下这个HTML 文档。

[root@lamp htdocs]# cat test.html

Test page

目标:同样是访问test.html 这个文档,其中www.a.com/test.html是正当访问,而

www.b.com/test.html则是应该被过滤掉的盗链请求,可拒绝请求或返回特定告警图片。

实例:盗链的网易博客、qq 相册的图片在其他网站上显示“此图片属于网易博客”“此图片转自QQ 空间”。 在虚拟主机a.com 中写入这些内容

RewriteCond {REQUEST_URI} !^/image/error.jpg

RewriteCond {HTTP_REFERER} !^http://www.a.com.*$ #RewriteRule .*jpg http://www.a.com/image/error.jpg [R,L] RewriteRule .*jpg image/error.jpg [R,L]

第一个RewriteCond 很简单,要求URI 部分不是^/image/error.jpg,这是为了防止死循环。

第二个RewriteCond 从变量从{HTTP_REFERER}着手进行筛选,{HTTP_REFERER}是整个页面地址,从log 里看 就是http://www.b.com/test.html;这一条是为了防止误杀自己的访问请求。然后应用RewriteRule 将jpg 请求 重定向到error.jpg 页面。我们可以把筛选规则从jpg 换成png 或者mp3、avi ,达到限制其他对媒体文件的目的。 我们一般的URL 重写都是用的“RewriteRule .*jpg http://www.a.com/image/error.jpg”这个 规则,但好像内嵌图片这类反盗链操作反而不能用这个方式来写了,请高手指正并解惑一下。

,

总结

在写这个Rewrite 文档之前,我不会看日志、不会用正则、甚至不会配apache 虚拟主机;

但经过写这个文档和这一系列测试,我的收获可以用满载而归来形容。

本来想继续写高级Rewrite 重定向,但是手头的工作实在是多,生活上的事情也

非常多,都挤到一起了,只好暂告一段落,日后再写高级Rewrite 重定向了。

可爱的卧底 2009-11-12

第7页

我的Rewrite 测试(附录)

1,虚拟主机的默认配置

NameVirtualHost *:80

ServerName www.a.com

ServerAlias a.com *.a.com

DocumentRoot /usr/local/apache/htdocs

ServerName www.b.com

DocumentRoot /usr/local/apache/htdocs

ServerName www.aaa.com

DocumentRoot /usr/local/apache/htdocs

2,Rewrite 模块参数详解

因为RewriteCond 在三级日志中并不显示,且本例中的两个RewriteRule ^(.*)$和^/(.*)$太无“标志性”,太容易被混淆,特针对

a.com/1.txt==>www.a.com/test/1.txt做了一个醒目的专用规则,看了这个 日志以后你会发现电脑显然没有人脑那么聪明,很多我们“想当然”的东西 电脑并不会去照办。

下面是具体的Rewrite 规则。

RewriteCond {HTTP_HOST} ^a.com

RewriteRule ^(.*)$ http://www.a.com$1 [R]

RewriteCond {REQUEST_URI} !^/test/*

RewriteRule ^/(1.txt*)$ /test/$1 [R,L]

下面是具体的日志,希望这个日志能启发下大家怎么更好的进行测试,也希 望藉此提醒自己在业务服务器上部署复杂的Rewrite 时考虑下效率问题。 init rewrite engine with requested uri /1.txt

applying pattern '^(.*)$' to uri '/1.txt'

rewrite '/1.txt' -> 'http://www.a.com/1.txt'

explicitly forcing redirect with http://www.a.com/1.txt

,

applying pattern '^/(1.txt*)$' to uri 'http://www.a.com/1.txt'

escaping http://www.a.com/1.txt for redirect

redirect to http://www.a.com/1.txt [REDIRECT/302]

init rewrite engine with requested uri /1.txt

applying pattern '^(.*)$' to uri '/1.txt'

applying pattern '^/(1.txt*)$' to uri '/1.txt'

rewrite '/1.txt' -> '/test/1.txt'

explicitly forcing redirect with http://www.a.com/test/1.txt

4,Rewrite 的具体过程的小细节(二);

经过第一次转换之后,在第二次转换的时候,竟然又应用了一次第二行的 RewriteCond ,而且这次匹配又没有下文了直接应用第四行的RewriteCond 附录1

我的Rewrite 测试(附录)

更改虚拟主机www.a.com 中的log 等级为最高级。

RewriteLogLevel 8

然后我们会发现多出来两条日志:

applying pattern '^(.*)$' to uri '/1.txt'

RewriteCond: input='www.a.com' pattern='^a.com' => not-matched

一直以为是先做RewriteCond 后作RewriteRule ,没想到在应用了URI 匹配之后才去做

RewriteCond 对比,这里的对比结果是“not-matched ”,所以就没应用;

applying pattern '^/(.*)$' to uri '/1.txt'

RewriteCond: input='/1.txt' pattern='!^/test/*' => matched

这个对比结果就匹配了,就可以正式应用了。

PS :据说八级日志很消耗系统资源,甚至三级日志都是最好别开,生产环境悠着点吧。

5,Rewrite 的具体过程的小细节(三);

在做URL 重定向的时候遇到了问题并发帖求助:

附录2

附录2

我的Rewrite 测试(附录)

HTTP_USER_AGENT Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/HTTP_REFERER null

HTTP_COOKIE null

HTTP_FORWARDED null

HTTP_HOST www.aaa.com 浏览器输入的域名

HTTP_PROXY_CONNECTION null

HTTP_ACCEPT text/html, application/xml;q=0.9, application/xhtml xml,

,

image/REMOTE_ADDR 192.168.118.1

REMOTE_HOST 192.168.118.1

REMOTE_PORT 三次的值都不一样2073、2074、2076

REMOTE_USER null

REMOTE_IDENT null

REQUEST_METHOD GET

SCRIPT_FILENAME /index.html

PATH_INFO null

QUERY_STRING null

AUTH_TYPE null

DOCUMENT_ROOT /usr/local/apache/htdocs

SERVER_ADMIN you@example.com

SERVER_NAME www.aaa.com 虚拟主机的名字

SERVER_ADDR 192.168.118.131

SERVER_PORT 80

SERVER_PROTOCOL HTTP/1.1

SERVER_SOFTWARE Apache/2.2.10

TIME_YEAR 2009

TIME_MON 10 [root@www ~]# date

TIME_DAY 13 Tue Oct 13 16:06:59 CST 2009

TIME_HOUR 16

TIME_MIN 9

TIME_SEC 11

TIME_WDAY 2

TIME 20091013161256

IS_SUBREQ FALSE

如果正在处理的请求是一个子请求,它将包含字符串"true" ,否则就是"false" 。模块为了解析URIAPI_VERSION 20051115:18

这是正在使用中的Apache 模块API(服务器和模块之间内部接口) 的版本, 其定义位于include/ap_THE_REQUEST GET /index.html HTTP/1.1

这是由浏览器发送的完整的HTTP 请求行(比如:"GET /index.html HTTP/1.1")。它不包含任何浏览REQUEST_URI /index.html

这是在HTTP 请求行中所请求的资源(比如上述例子中的"/index.html")。 REQUEST_FILENAME /index.html

这是与请求相匹配的完整的本地文件系统的文件路径名。

HTTPS off__

标签: