1.环境
window xp
httpd-2.2.22-win32-x86-openssl-0.9.8t.msi
2.httpd.conf配置
进入D:\wsr\Apache Software Foundation\Apache2.2\conf,修改如下内容:
a.去除 # LoadModule rewrite_module modules/mod_rewrite.so中的第一个# 。
b.修改AllowOverride None为AllowOverride All 。(有好几处,我这种情况下,修改“<Directory "D:/wsr/Apache Software Foundation/Apache2.2/htdocs">”下的)
c.去除# CustomLog "logs/access.log" combined中的第一个# 。
其中a,b是为了加载重写模块,c是为了“D:\wsr\Apache Software Foundation\Apache2.2\logs\access.log”更详细,方便我们。更改后人日志信息如下:
127.0.0.1 - - [18/Aug/2012:16:20:42 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/4.0 (compatible; MSIE 8.0 ; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 127.0.0.1 - - [18/Aug/2012:16:20:45 +0800] "GET / HTTP/1.1" 304 - 127.0.0.1 - - [18/Aug/2012:16:20:45 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1 " |
红色,为IE8访问结果,绿色为FF访问结果
3.试验
3.1试验1
httpd.conf中添加([NC]为大写,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来)
NameVirtualHost *:80 <VirtualHost *:80> ServerName localhost DirectoryIndex index.php index.html index.htm <IfModule rewrite_module> RewriteEngine On RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.* [NC] RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.0.* [NC] RewriteRule ^/ http://firefox.com.cn/ RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4.0.* [NC] RewriteRule ^/ http://www.msn.com.cn/ </IfModule> </VirtualHost>
其效果,和我想象的一样,伪代码如下:
if(HTTP_USER_AGENT.startWith("Mozilla/5.0")&&HTTP_USER_AGENT.startWith("Mozilla/3.0")){ System.out.println("(显然不可能执行)FF访问去火狐了 http://firefox.com.cn/"); } if(HTTP_USER_AGENT.startWith("Mozilla/4.0")){ System.out.println("IE8访问,去微软了 http://www.msn.com.cn/ "); }
3.2试验2
httpd.conf中添加
<IfModule rewrite_module> RewriteEngine On RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.* [NC] RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.0.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4.0.* [NC] RewriteRule ^/ http://firefox.com.cn/ </IfModule>
本来我以为 产生的伪代码是:
if(HTTP_USER_AGENT.startWith("Mozilla/5.0")&&HTTP_USER_AGENT.startWith("Mozilla/3.0")||(HTTP_USER_AGENT.startWith("Mozilla/4.0")){ System.out.println("IE8访问,去微软了 http://www.msn.com.cn/ "); }
但实际结果却是:
if((HTTP_USER_AGENT.startWith("Mozilla/5.0")&&HTTP_USER_AGENT.startWith("Mozilla/3.0"))||(HTTP_USER_AGENT.startWith("Mozilla/4.0")){ System.out.println("IE8访问,去微软了 http://www.msn.com.cn/ "); }
注意括号 。由此可见,在apache的重写配置中,“或||”的优先级高于“且&&”的优先级 ,这一点与平时写程序相反。