• ベストアンサー

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を表示していきたいからです。

  • CGI
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答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

  • ランダムに1行読込み フォーム文字との同異を 判定するには?

    txt ファイル から ランダムに 1行読み込んで それが フォームの入力文字と同じかを 判定し、 同じならば、次のファイルへ飛ぶ には、 どうしたらよいのでしょうか? お教えください。 ------------------------------------------------------ mondai.txt に 問題を 1行に 1題ずつ kotae.txt に 解答を 1行に ひとつずつ 書きました。 mondai.txt の 1行目の 解答が kotae.txt の 1行目 (2行目-10行目、同じ)としました。 001.cgi で 正解すれば 002.cgi を開く 不正解なら もう一度 001.cgi を実行。 問題は ランダムに 表示する。 まず、mondai.txt と kotae.txt を それぞれ 10行にして やってみました。 ------------------------------------------------------ すると、問題は ランダムに表示されました。 しかし、 ##################################################### if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; ・・・ { ##################################################### が、うまくいきません。 ↓こうしてあります。どうしたら、よいでしょうか? ↓解答したことを file.txt に記録しよう、ともしています。 ↓ ################ はじめ ############################## #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon = sprintf("%02d", $mon + 1); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); my $num = ('1267'); my $num2 = $num + 1; my $value = param('answer'); open(FILE, "../../mondai.txt"); my @data2 = <FILE>; close(FILE); open(FILE, "../../kotae.txt"); my @data3 = <FILE>; close(FILE); my $i = int(rand(10)); my $ans = $data3[$i]; if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; open(FILE, '<+file.txt') or die "$!"; my @DATA = <FILE>; close(FILE); open(FILE, '>file.txt') or die "$!"; print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE (@DATA); close(FILE); } else { print header(-charset => 'Shift_JIS'); print start_html("$num.cgi"); print ('<font face="century">'); print $data2[$i]; #####---問題表示 print br; print startform( -method => 'POST', -action => "$num.cgi" ); print blockquote( textfield( -name => 'answer', -size => '70', -id => "next", -accesskey => '[' ) ); print <<END; <script type="text/javascript" language="JavaScript"> document.getElementById('next').focus(); </script> END print submit(-value => 'Send ( ↑Alt+[ )'); print endform; } ################ おわり ############################## よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • テキストファイルを読んで次のcgiファイルを動かすには?

    お願いします。初心者です。 0001.cgi で 正解 Einstein を Send すると  file.txt に -1 と書き込むようにしました。 さらに  0002.cgi へのリンクが出て、これをクリックすると 0002.cgi が動くようにしました。  そして、 file.txt に -1 が ない場合に 0002.cgi が動き始めないようにしようとしています。 0001.cgi の問題に正解しないと、0002.cgi へ行けない ようにしようとしています。どうしたらよいのでしょうか? どうか、お教えください。 よろしく、お願いいたします。 0001.cgi は、こんなふうになっています。 ↓ ---------------------------------------- print header; # -------------------------------------- print start_html('0001'); #ここに問題を入れました 答は Einstein です。 print startform( -method => 'POST', -action => '0001.cgi' ); print blockquote( textarea( -name => 'die Antwort', -rows => '3', -columns => '40' ) ); print br; print submit(-value => 'Send'); print reset; print endform; # -------------------------------------- if (param('die Antwort') eq 'Einstein'){ print h2('Einstein'); print h2('<a href="0002.cgi">next page</a>'); open(FILE, '>>file.txt') or die "$!"; print FILE ("-1"); close(FILE) } else{ print h3('false'); } # -------------------------------------- print end_html; # --------------------------------------

    • ベストアンサー
    • CGI
  • 次のcgiファイルを開くには? もう一度

    http://oshiete1.goo.ne.jp/qa3951263.html で質問している者です。 間違って、[回答への補足] に書いてしまいました。 もう一度質問させてください。すみません。 Location を 教えていただき、とても感謝しております。 でも、私の 001.cgi は 以下のように始まっております。 print header(-charset => 'Shift_JIS'); print start_html("001.cgi"); このprint header(-charset => 'Shift_JIS');を消して if (param('answer') eq $ans){ print ('Location:002.cgi\n\n'); } else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { としたのですが、だめでした。 if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか? ###### はじめ ##################### #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); print "Location:1266.cgi\n\n"; ###### おわり ##################### としたら、001.cgi を開くと 002.cgi へ飛ぶことができました。 どこに print "Location:1266.cgi\n\n"; を書けばよいのでしょうか? よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • 何で出来ないか分かりません

     PerlおよびCGIを最近はじめました。教科書を見ながら作っているのですが、ファイルへの書き込み・読み出しがよく分からないので、質問しました。  1つのページにラジオボタンが2箇所あり、それぞれ選択後「送信」ボタンを押して次のページへ行くのですが、ボタンの情報をファイルに書き込みたいのですがうまくいきません。 プログラムは、 print startform( -method => 'POST', -action => 'menu.cgi', ); print blockquote( radio_group( -name => 'A', -values => [ '1', '2', '3', '4', '5' ], -default => '1', -linebreak => 'true', ) ); print hr; print blockquote( radio_group( -name => 'B', -values => [ 'a', 'b', 'c', 'd', 'e', 'f','g', 'h' ], -default => 'a', -linebreak => '', ) ); print hr; print br; print submit( -value => '送信', ); print reset; print hidden( -name => 'type', -value => '', ); print end_form; print end_html; #----------------------------------------- open ( NEW, '> data.txt' ) or die "$!\n"; print NEW "$gakka, $gakunen, $type"; close ( NEW ); ・・・という感じです。途中の『hidden』は次のページで必要なものです。 このままやると、『data.txt』は作られるのですが、 , , という内容になってしまいます。  初歩的なこととは思いますが、いろいろ試しても出来ませんでした。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ランダムリンクについて(フレーム使用)

    ランダムリンクについて(フレーム使用) ランダムリンクを設定したのですが、 その後の表示までかなり時間(5秒くらい)がかかります。 どのようにしたら改善されるのでしょうか。 フレームは左右に分けてあり 左をleft 右をright としてあります。 <head></head>中には、 <SCRIPT Language="JavaScript"> <!-- function randomJump() { theURL = new Array(); theURL[0] = "a.htm"; theURL[1] = "b.htm"; theURL[2] = "c.htm"; theURL[3] = "d.htm"; linkCount = 4; num = Math.floor(Math.random() * linkCount); parent.frames["right"].location.href = theURL[num]; } // --> </SCRIPT> <body></body>中には <A HREF="javaScript:randomJump()"> <IMG src="gazou.gif" width="9" height="12" border="0"> </A> です。 適当にサイトから見つけてきたのを変えただけなので 詳しい知識はありません。 どなたかご教授のほど宜しくお願い致します。

  • PC・携帯等のアクセス時の自動振り分けについて

    現在自身でホームページを所有・管理しているのですが、index.cgiにより振り分け設定をしています(厳密に言えば、2年くらい前に人にしてもらいました)。 ところが、PC・Docomo・auに関してはそれぞれのページに振り分けられるのですがsoftbankだけはPCのページに振り分けされてしまいます。 ちなみに当方のサーバー上にあるindex.cgiに書かれてる構文は以下の通りです。 #!/usr/bin/perl $ua = $ENV{'HTTP_USER_AGENT'}; if(index($ua, "DoCoMo")>=0) { print "Location: http://www.00000.com/i/index.htm\n\n"; } elsif(index($ua, "J-SKYWEB")>=0) { print "Location: http://www.00000.com/j/index.htm\n\n"; } elsif(index($ua, "KDDI")>=0) { print "Location: http://www.00000.com/ez/index.htm\n\n"; } else { print "Location: http://www.00000.com/index.html\n\n"; } exit; 図々しいお話かもしれませんが、この構文をご訂正して頂ける方もしくは素人向けのよきアドバイスを頂ける方よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ランダムリンク

    http://www7.big.or.jp/~falcon/cgi/link.htm 上記のサイトのランダムリンクを使ってるのですが、PCではちゃんと反応し、ドコモの携帯からHPを確認したらちゃんと反応するのですが、AUだけなぜか反応しません。 CGIなどあまり詳しくないのでわからないのですが、AUに反応させるにはなにか方法があるんでしょうか?

    • 締切済み
    • CGI
  • flockが使えない場合のスクリプトを教えて下さい

    こんにちわ。私はwindows meなのですがflockが使えないようなのでその場合はどのようなスクリプトで表現したらよいのか方法があったら教えて下さい。このflockの部分に代わるものを教えて下さい、又他の方法があればアドバイス下さい。宜しくお願いします。 open(COUNT,"+<countdata.txt") || die "File'countdata.txt'Open Error\n"; #flock(COUNT,2); $counter=<COUNT>; $counter_new=$counter+1; print"$counter_new\n"; seek(COUNT,0,0); print COUNT"$counter_new\n"; close(COUNT); #flock(COUNT,8);

    • ベストアンサー
    • Perl
  • Locationについて

    こんにちは。 今PerlでLocationを使って2つに分かれているフレームの(frame1とframe2)frame1にリンクをさせようとしています。 下のソースの中にTarget="frame1"を追加したいのですが追加は可能でしょうか? プログラムはこんな↓感じです。 print "Location: http://www.XXX/cgi-local/XXX.cgi?free=$XX\n\n"; ご教授ください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • cgiでランダムにファイルを呼び出す方法

    下記、CGIにてランダムに2つのホームーページを呼び出しているのですが、インフレームなどで大量に呼び出した場合、ランダムさに欠けると感じているのですが、このコードをどのように改良すればよいでしょうか? それとも、もっと、大量の状態で実験しないと分からないものでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl my $base = './'; my @files = ('a.html', 'b.html'); my $count = @files; srand(); my $url = $base . $files[rand($count)]; print "Location: $url\n\n";