• ベストアンサー

302 Found 回避方法について

仕様ブラウザ:Firefox 使用OS:Windows XP 使用言語:Perl 例えば、 list.txt:1行に1つのアドレスを複数行書いてあるtxt location.cgi:list.txtに書いてあるアドレスをランダムに表示させるCGI の時に、 http://***/location.cgi のように、HP上に自作のCGIを乗せて、アクセスしたところ 「302 Found The document has moved here.」 と表示されます。 302Found のhereをクリックして表示された部分のアドレスも http://***/location.cgiであり、 再び、 「302 Found The document has moved here.」 と表示されます。以下繰り返しの状況が続きます。 調べたところ、 URIが一時的に移動しているというのがわかったのですが、 解決方法がわからなかったので質問させていただきます。 location.cgiの概要は、以下です。 あと、スタートする前に、隠しフォームで、name="start",value="start"を渡しています。 location.cgi #!/usr/local/bin/perl #隠しフォームでstartを持っていたらlist.txtに表示したい全てのURLを書き込む #%inがフォームからの情報受け取りしています。 if($in{start} =~ /start/){ #list.txtを書き込み専用で開く #全url(***01~10)を書き込む open (RESET,">list.txt") or die; for($num = 1; $num <= 10; $num++){ if($num <= 9){ print RESET "http://***0$num.htm\n"; }else{ print RESET "http://***$num.htm\n"; } } close(RESET); } #list.txtを読み込み専用で開く #@linkに読み込み内容を格納 open (READ,"list.txt") or die; @link = <READ>; foreach(@link){ chomp($_); } close(READ); if($link[0] !~ /http.*htm/){ #participants.htmへLocation print"Location: http://***/last.htm\n\n"; #list.txtを書き込み専用で開く #全url(***01.htm~***10.htm)を書き込む open (PRINT,">list.txt") or die; for($num = 1; $num <= 10; $num++){ if($num <= 9){ print PRINT "http://***0$num.htm\n"; }else{ print PRINT "http://***$num.htm\n"; } } close(PRINT); }else{ #@linkの要素をランダム化 srand; @new = (); while(@link){ push(@new,splice(@link,rand @link,1)); } #ランダム化したリンクにLocation print"Location: $link[0]\n\n"; #list.txtを書き込み専用で開く #@newの先頭配列を消去してから書き込む open (PRINT,">list.txt") or die; shift @new; foreach(@new){ print PRINT "$_\n"; } close(PRINT); } ※配列の中身を消して、list.txtに書きなおしていたりするのは、 非重複でランダムにURLを表示していきたいからです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>while(@link){ >push(@new,splice(@link,rand @link,1)); >} > >#ランダム化したリンクにLocation >print"Location: $link[0]\n\n"; @linkは中身がなくなっていると思いますし、$link[0]はundef(何も出力されない)ではないでしょうか。 ここは$link[0]ではなく$new[0]になると思います。 余談ですが、 newというのは予約語にもありますから、変数名にするのは好ましくないと思います。

ok_coffee
質問者

お礼

ご返答ありがとうございます。 ローカル環境でテストした場合は、$link[0]には、 ランダム化したURLが出力されていたのですが、 ご指摘の通りに $new[0]に変更後、@new関連の変数名を変更したら、 動作いたしました。 なぜ、@linkがローカルとサーバー動作で違うことになるのかを調べてみようと思います。 今後、質問する機会があると思いますので、その時は、 お力を貸していただければ幸いです。 ありがとうございました。

関連するQ&A