• 締切済み

Locationの部分をいじる

携帯サイトを作っています。 パスワード認証(1.cgi)→端末振り分け(2.cgi)という流れにしたいのですが、vodaとPCは問題なく各々の目的のページに飛べるのですが、i-modeがエラーがでてしまうようです。 振り分け先に指定しているURLなんかはちゃんと合っています。 どうも、i-modeでLocationが機能しないのが原因ではないかと思うのですが、cgiのいじり方が分かりません。 サポートBBSによると1.cgiの以下の部分を変えるそうなのですが if ($pass eq $password) { print "Location: $cgi\n\n"; exit; } の部分のLocationが機能しないのだと思います。 秘密cgiで表示する最初のページを、この部分で読み込み表示する方法や、この部分にcgiへのリンクを張る方法をとられてはいかがでしょう? ということで、具体的にどうしたらよいのか分かりません。(サポートBBSが実質停止状態なので・・・) わかる方いらしたら、ご教授いただければと思います。

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

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

検索していたらi-mode では、Locationに相対表記の URL は使用できないという記述を見つけました。というかLocationヘッダのURLはhttp://から書かないといけないと決められているので正常な動作といえます。 ということで print "Location: $cgi\n\n"; exit; の$cgiが相対URLになっているのではないでしょうか。

makiron193
質問者

補足

ありがとうございます。 $cgiってこの場合、振り分けCGIのことですよね。 はじめに絶対URLでリンク先のhtmを書いてたのですが これでvoda○ i-mode×でした。 それでパスワードcgiの説明を読んだら $html="secret.cgi"; 秘密ファイル(パスワードが一致した場合にオープンするファイル)です。 ipasswd.cgiと同じフォルダに置いてください。 ※そこからリンクしてあるファイルは、別のフォルダでも構いませんが、  相対パス(../../×××.cgi)にしてください。 の表記があったので相対URLにしたんですが、これでも voda○ i-mode×でした。 うーもう、なにがなんだか・・・(>_<)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

Location先のページはi-modeで問題なく開けますか? 基本的にLocationはサーバで行うため、キャリアにはあまり関係がないはずなのです。 飛び先のページそのものがi-modeでは開けない可能性もあります。

makiron193
質問者

補足

ありがとうございます。ためしに、振り分けCGIのほうに直接アクセスしたら、ちゃんと飛び先のhtmがちゃんと開けたそうです。 なので、やっぱりパスワードCGIのほうに問題があるかと思います。

関連するQ&A

  • Location: で cgi → cgi は不可?

    print "Location: ./index.cgi\n\n"; 上記の命令でエラーとなります。 i-mode用のHPを作ろうと思うのですが,情報の受渡が必要でして・・・ どうすればいいのでしょう? 何かいい方法有りませんか?

    • ベストアンサー
    • Perl
  • エラーページでLocationしたい

    .htaccessにて ErrorDocument 403 /error.cgi とかしておいて error.cgiにて #!/usr/bin/perl print "Location:http://domain/\n\n"; みたいなことしたいんですが、IEではページの表示が認められてませんとなってしまいました。 一応内容を表示して Refresh:0;URL=..... としたら飛んでくれますが、LocationはエラーCGIでは使えないんでしょうか。 ----- Apache/1.3.26 Server perl, version 5.005_03 built for sun4-solaris Windows 2000 Pro SP1 Internet Explorer 5.5 SP2

    • 締切済み
    • CGI
  • perlでLocation

    Locationでは#xxxというのは使えないのでしょうか? #!/usr/local/bin/perl print "Location:xxx.cgi#xxx/?userID=$name\n\n"; exit; という風に書いています。 xxx.cgiはローカルにあるcgiでそのcgiの中身は表示できます。 しかしxxx.cgiの中の <xxxx.cgiの中身> print <<"EOM"; <html> . . . <A NAME="xxx>image</A> . . . </HTML> EOM exit; xxxのところでなく一番最初が表示されてしまいます。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • Locationでターゲット指定はできますか?

    print("Location: ../admin.cgi?action=head&page=cnn\n\n"); のように他のcgiへページを移行しているのですが、フレームの中に cgiファイルを出力しているのでtargetの指定が必要になります。 Locationを使ってtarget指定は出来ないのでしょうか? もし、やったことのある人がいればご指導ください。

    • ベストアンサー
    • Perl
  • Locationを使いたいのですが

    はじめて質問します。よろしくお願いします。 フォームからデータを受け取って、なんらかの処理をしてから、 locationで別のページへジャンプしたいのです。 下のソースで、ローカル(win95)では正常に動いたのですが、 サーバーに移すと送信後のtest.cgiがエラーになってしまいます。 text.txtへの書込みはちゃんと行われています。 原因がわからなくて困っています。 locationの使い方が間違っているのでしょうか? ↓↓ test.cgiソース ↓↓ ------------------------------------------------------------ #!/usr/bin/perl require 'jcode.pl'; &decode; if ($FORM{'cmd'} eq "regist") { &write; # ファイル書込み print "Location: index.html\n\n"; } else { print <<END; Content-type: text/html <HTML><HEAD><TITLE>タイトル</TITLE></HEAD> <FORM ACTION="test.cgi" METHOD="POST"> <INPUT TYPE=TEXT NAME="message" VALUE=""> <INPUT TYPE=SUBMIT NAME="submit" VALUE="送信"> <INPUT TYPE=HIDDEN NAME="cmd" VALUE="regist"> </FORM> </BODY></HTML> END } exit; # ファイル書込み sub write { open OUT, ">test.txt"; print OUT "$FORM{'message'}\n"; close OUT; }

    • ベストアンサー
    • Perl
  • ひとつのCGIファイルに複数のページの動作を管理

    CGI超初心者です。 HTMLファイルにいくつかラジオボタンを設置し、 これとこれを選んだらこのページを開く、 次のページで、 これとこれを選んだらこのページを開く・・・ というような構成でサイトを作っています。 CGIで条件分岐させていますが 書き方が良く分からないので教えてください。 第一ページ用の条件分岐CGIの下に、第二ページ用の条件分岐CGIを書きましたが うまく動いてくれません。 どちらかを削除するとうまく動きます。 ひとつのCGIファイルに、 複数のページの条件分岐をまとめて書くことは出来ないのでしょうか? ページごとに別々のCGIファイルを作成しなければならないですか? 以下具体例です。 ---第一ページ.html--- <form name="q1" action="test.cgi" method="POST" > ・・・ <input type="submit" value="送信する" /> </form> ---第二ページ.html--- <form name="q2" action="test.cgi" method="POST" > ・・・ <input type="submit" value="送信する" /> </form> ---CGI--- #====================下準備====================== if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } #===================変数の設定=================== $q11 = $FORM{'q11'}; $q12 = $FORM{'q12'}; #=================条件分岐_質問1================= if ($q11 eq "q11_a") { print "Location: ./ba1.html\n\n"; } elsif ($q11 eq "q11_c") { print "Location: ./ba2.html\n\n"; } ・ ・ ・ else { print "Location: ./go2.html\n\n"; } #===================変数の設定=================== $q21 = $FORM{'q21'}; $q22 = $FORM{'q22'}; #=================条件分岐_質問2================== if ($q21 eq "q21_a") { print "Location: ./co3.html\n\n"; } elsif ($q22 eq "q22_a") { print "Location: ./ba4.html\n\n"; } ・ ・ ・ else { print "Location: ./go3.html\n\n"; }

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

    1.htmlにおいて、 <script type="text/javascript" src="hostchk.cgi"></script> を指定しています。 cgiの中で、ある条件の時に、Locationの指定があるのですが、 ページに飛びません。 つまり私は、 1.htmlのページを見たとき、cgiの中で、条件が一致した場合、 ページを飛ばしたいのですが、私が知識がないので、 ページに飛びません。 cgiは正常に動いている証拠に、↑と同じ条件で1.htmlに文字を表示させることには成功しました。 何故、飛ばないのでしょうか。 もし他の方法で飛ばす事が出来るのであれば教えて下さい。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • Gecko エンジンでの Location ヘッダについて

    以前に投稿したのですが回答が得られなかったので削除して再質問です。 Gecko エンジンで Location ヘッダを送信してリダイレクトした後の ページで更新(ページリロード)すると反応がおかしいようです。 例えば a というページから b というページにリダイレクトをして b で更新をかけるとページの URL は a であると判断されてしまうよう です。 # 検証用 CGI (index.cgi) use strict; &main(); sub main { my $cgi = &getreq(); my $min = (localtime())[1]; # キャッシュしない print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; if($cgi->{'min'} eq '') { # $cgi->{'min'} が空なら # (Gecko では更新した時にもこっちにくる) print "Location: ./?min=$min\n\n"; exit; } elsif($cgi->{'min'} ne $min) { # 分が異なる場合 (Gecko はこない) print "Content-type: text/plain\n\n"; print "\$cgi->{'min'}=$cgi->{'min'}\n"; exit; } # $cgi->{'min'} と $min が同じ print "Content-type: text/plain\n\n"; print "min=$min\n"; exit; } sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } CGI::Session でセッション管理をしようとしたところ、IE(Trident)と Opera(Presto)では正常なのですがFirefoxでうまく動作しなかったので よく調べてみたところこのような状態です。 どうにかならないでしょうか。 因みに、後で調べてみるとSafari(WebKit) for Winでも正常でした。 現象が発生するのはGeckoのみです。 (Fxの他、SeaMonkeyでも同様の現象を確認しています)

    • ベストアンサー
    • CGI
  • 続Gecko エンジンでの Location ヘッダについて

    Gecko エンジンでの Location ヘッダについて http://oshiete1.goo.ne.jp/qa4227374.html の続きです。 なんだかよく分からない状況になったのでより実際の処理とほぼ同様の 処理を行っているサンプルを用意しました。 # セッション管理 use strict; use CGI::Session; &main(); # メイン sub main { my $cgi = &getreq(); print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; # セッション取得 my $session = &session($cgi); # セッションが取得できない場合、再取得 if($session == undef) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; $session = &session({}); # セッション ID を取得してリダイレクト my $id = $session->id(); print "Location: ./?CGISESSID=$id\n\n"; exit; } my $id = $session->id(); if($cgi->{'CGISESSID'} eq '' || $cgi->{'CGISESSID'} ne $id) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; # セッション ID が指定されていないまたは # セッション ID が異なる場合リダイレクト print "Location: ./?CGISESSID=$id\n\n"; exit; } print "Content-type: text/plain\n\n"; print "CGISESSID=$id\n"; print "OK\n"; exit; } # CGI リクエストの取得 sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } # セッション取得 sub session { my $cgi = shift; my $dir = { 'Directory' => 'tmp' }; CGI::Session->find(undef, sub {}, $dir); if($cgi->{'CGISESSID'} eq '') { my $session = new CGI::Session(undef, undef, $dir); $session->expire("1h"); return $session; } my $session = CGI::Session->load(undef, $cgi->{'CGISESSID'}, $dir); return ($session == undef || $session->id() eq '') ? undef : $session; } こんな感じのCGIで以下のような状況の時にページを更新すると IE(Trident)/Opera(Presto)及びSafari for Win(WebKit)では 正常に動作するのですがFxやSeaMonkey(Gecko)ではおかしな動作を します。 1. セッションが切れた時 2. セッションファイルを手動で削除した時 具体的にはセッションが切れたら再度新しいセッションを作成して リダイレクトをするようにしてあるのですがGeckoでは一度セッションが 切れると更新する度に新しいセッションを作成するようになってしまい ます。 以前の質問の回答のように Status: 303 See Other ヘッダを出力して 見たのですがやはり効果はないようです。 Cookieは使いたくないのでセッションID(sesid)をCGIリクエストで 送信しているのですがこの方法がまず問題なのでしょうか。 他にも問題のある部分がありましたらご指摘お願いします。

    • ベストアンサー
    • CGI
  • PerlのLocation:が文字として出力されてしまいます

    Perl/CGI内でボタンを配置し、そのボタンを押すとサブルーチンにあるprint "Location: $戻り先\n\n";でジャンプするようにしたいのですが、 「Content-type: text/html」より後にLocationを使うとジャンプせずに画面に文字として「Location: $戻り先」と表示されてしまいます。 このような場合どうすればよいのでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう