0

我使用 mod_rewrite 使用 apache httpd 2.2.15 (Unix)

我正在进行这个重写:

RewriteEngine On
RewriteLogLevel 7
RewriteMap encode-map prg:/var/www/centos6.local/encode.pl
RewriteLog "/var/log/httpd/centos6.local-rewrite_log" 
RewriteCond %{QUERY_STRING} CID=(.*)
RewriteRule .* - [L,CO=NDD_COOKIE:${encode-map:%1}:ndipiazza.test.local:50000]  

这样做的目的是检测您是否在查询字符串的任何位置找到 CID=xyz。如果这样做,请创建一个带有 xyz 的 cookie NDD_COOKIE,由自定义 perl 脚本 /var/www/centos6.local/encode.pl 编码

这只会设置一次cookie,然后在服务器完全重新启动之前不会再次设置cookie。

0) 设置 hosts 文件,使 ndpiazza.test.local 指向 192.168.2.7

1) 启动http://ndipiazza.test.local/test.html?CID=test123

结果:编码的cookie按预期写入

2)切换到新的浏览器或清除浏览缓存。

3) 启动http://ndipiazza.test.local/test.html?CID=new567

结果:没有写入cookie!

这是 encode.pl 脚本的链接

为什么会这样?

这是http://ndipiazza.test.local/test.html?UID=sfsfsfd888m在它不起作用时的重写日志:

192.168.2.3 - - [28/Jun/2012:16:33:29 --0500] [ndipiazza.test.local/sid#7fc041c0c880][rid#7fc041d34608/initial] (2) init rewrite engine with requested uri /test.html
192.168.2.3 - - [28/Jun/2012:16:33:29 --0500] [ndipiazza.test.local/sid#7fc041c0c880][rid#7fc041d34608/initial] (3) applying pattern '.*' to uri '/test.html'
192.168.2.3 - - [28/Jun/2012:16:33:29 --0500] [ndipiazza.test.local/sid#7fc041c0c880][rid#7fc041d34608/initial] (4) RewriteCond: input='UID=sfsfsfd888' pattern='UID=(.*)' => matched
192.168.2.3 - - [28/Jun/2012:16:33:29 --0500] [ndipiazza.test.local/sid#7fc041c0c880][rid#7fc041d34608/initial] (5) map lookup OK: map=encode-map key=sfsfsfd888 -> val=
192.168.2.3 - - [28/Jun/2012:16:33:29 --0500] [ndipiazza.test.local/sid#7fc041c0c880][rid#7fc041d34608/initial] (5) setting cookie 'WS_CUID=ndipiazza.test.local; path=/; domain=50000'
192.168.2.3 - - [28/Jun/2012:16:33:29 --0500] [ndipiazza.test.local/sid#7fc041c0c880][rid#7fc041d34608/initial] (1) pass through /test.html
4

2 回答 2

1

http://httpd.apache.org/docs/current/rewrite/rewritemap.html#prg中所述,该脚本仅在启动 Apache HTTPD 时调用。应该为每个请求返回不同值的 RewriteMap 可能应该使用 dbd 处理程序(仅在加载和配置 mod_dbd 时可用)。

您可以将脚本作为 CGI 运行,甚至可以使用http://perldoc.perl.org/CGI/Cookie.html从 perl 代码设置 cookie ,或者使用 shell_exec 从 PHP 调用脚本并使用该值设置 cookie由该函数返回。

于 2012-07-03T18:57:26.170 回答
0

答:系统只会打开一次encode.pl。预计将持续监听标准输入。

但是您仍然可以使用 prg rewritemap 来执行此操作。

我缺少的一件大事是我需要在 perl 中的 while 循环。

这是我最终解决问题的方法:

httpd.conf 条目:

RewriteEngine On
RewriteLogLevel 6
RewriteLog "/var/log/httpd/centos6.local-rewrite_log" 
RewriteCond %{QUERY_STRING} UID=(.*)
RewriteMap encode-map prg:/var/www/centos6.local/encode.pl
RewriteRule .* - [L,CO=NDD_COOKIE:${encode-map:%1}:ndipiazza.test.local:50000]  

编码.pl:

#!/usr/bin/perl
sub trim($) 
{ 
   my $string = shift; 
   $string =~ s/^\s+//; 
   $string =~ s/\s+$//; 
   return $string; 
} 
    $| = 1; # Turn off I/O buffering    
    while (<STDIN>) {
        s/-/0/g; # Replace dashes with 0's
     $a = $_;    
     $s = '';
     for ($i=0; $i<length($a); ++$i) {
        $c = substr($a, $i, 1);     
            if ($c eq 'Z') { 
              $s = $s . 'a'; 
           } elsif ($c eq 'z') { 
              $s = $s . 'A'; 
           } elsif ($c eq '9') { 
           $s = $s . '0'; 
        } else { 
              $s = $s . chr(ord($c)+1); 
            }
     }
     $s = scalar reverse trim($s);
        print "$s\n";
    }
于 2012-07-03T21:39:25.753 回答