验证Apache中 RewriteCond 中or 、and逻辑

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的重写配置中,“或||”的优先级高于“且&&”的优先级 ,这一点与平时写程序相反。

猜你喜欢

转载自sunfish.iteye.com/blog/1636395