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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值