0

mod_rewriteを使用してApachehttpd2.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が見つかったかどうかを検出することです。その場合は、カスタムperlスクリプト/var/www/centos6.local/encode.plによってエンコードされたxyzを使用してCookieNDD_COOKIEを作成します。

これにより、Cookieが一度だけ設定され、サーバーが完全に再起動するまでCookieが再度設定されることはありません。

0)ndpiazza.test.localが192.168.2.7を指すようにhostsファイルを設定します

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に記載されているように、スクリプトはApacheHTTPDの起動時にのみ呼び出されます。リクエストごとに異なる値を返す必要がある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を1回だけ開きます。stdinを継続的にリッスンすることが期待されます。

ただし、prgrewritemapを使用してこれを行うことはできます。

私が見逃していた大きなことは、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]  

encode.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 に答える