• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIが、aタグで呼ばれたか、imgタグでか区別するには?)

CGIでaタグとimgタグを区別する方法とは?

このQ&Aのポイント
  • CGIでaタグとimgタグが呼ばれたかを区別する方法について教えてください。php内でタグを切り分け、imgタグの場合は指定された画像を表示し、aタグの場合は指定されたHTMLを表示したいです。
  • 常にheader('Content-Type: image/gif');としても良いと思いますが、?以降が間違えられる場合、クリックするとおかしな画面が表示されてしまいます。質問者は$_SERVERを調べましたがよくわかりません。お手数ですが教えていただけると幸いです。
  • また、切り分けた後の処理についても教えてください。質問者は($callで判定できると仮定しています)imgの場合はheader('Content-Type: image/gif');とし、img作成の処理を行い、aタグの場合やGETやPOSTの場合はheader('Content-Type: text/html; charset=SJIS');とし、HTML作成の処理を行います。質問者がやりたいことは、?以降にLaTeXの数式を書いた場合に画像を返すことです。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

・ブラウザからのリクエストとしては、A からのアクセスなのか IMG からのアクセスなのかを直接的に 区別するような情報はありません。 ・ただし、Accept: リクエストヘッダ($_SERVER['HTTP_ACCEPT']) に、そのリクエストでブラウザが受け取り可能なデータ形式の情報が入っています。 (Accept にどういう情報を載せるかはブラウザ次第です) というわけで、HTTP_ACCEPT が、「IMG 経由の場合は画像形式のみを指定されている」のであれば、どちらからあのアクセスか判断できることになります。 面白そうなのでちょっと調べてみました。いくつかのブラウザについて具体的に調べてみたところ、なかなか簡単には判断できなさそうです。 ・Firefox3.5 IMG の場合: image/png,image/*;q=0.8,*/*;q=0.5 A の場合: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 アドレスバー直打ち: Aの場合と同じ ・IE8 IMGの場合: */* Aの場合: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, application/pdf, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, application/x-shockwave-flash, */* アドレスバー直打ち: Aの場合と同じ ・Opera 10 IMGの場合: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Aの場合 : text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 アドレスバー直打ち: Aの場合と同じ といった感じになりました。 ブラウザが送り出すリクエスト情報については、このAccept:以外はまったく同じでしたので、Accept以外の情報で判断することは不可能です。 お望みの機能を実現するとしたら、上述のようなAccept:ヘッダ情報の違いで判別するしかありません。 上述のように、ブラウザ毎に動作が違いますから、汎用的な判断は無理そうです。 どうしても実現したかったら、User-Agent: リクエストヘッダ($_SERVER['HTTP_USER_AGENT'])によるブラウザチェックを併用して、 ・Firefox3.5の場合→HTTP_ACCEPT にtext/ が含まれるなら A 経由と判定 ・IE8の場合→HTTP_ACCEPT に application/ が含まれるなら A 経由と判定 ・Opera 10 の場合→判断不可能 といった感じでしょうか。 このやり方で実現するなら、私が今回調べた Fx3.5・IE8以外にも、使われる可能性のあるブラウザについては、どうなっているのか実際に調べる必要があるかと思います。 また、User-Agent は詐称可能ですから、使っているブラウザの誤判定による誤動作の可能性は捨て切れません。 また、アドレスバーに直接URLを入れた場合は、A経由相当になりますので、 画像として表示することはできなくなります。

morimot703
質問者

お礼

ご調査頂きありがとうございます。 >使われる可能性のあるブラウザ Safari=Chrome  とかありますし、動画取得用の特殊ブラウザもあります。 また、今後増えるかも知れません。 それで、 ・Firefox3.5 ・IE8 ・IE7 (自分で調べてみます) 限定で行きます。他の場合は「出来るだけ救う」仕様で、、、 (詐称されての誤動作は、相手の期待通りか、変なブラウザなので、誤動作でOK) 以下のコーディングにしようと思います。 アドバイス頂ければ幸いです。 <?php   session_start();   $_session["qstr"] = urldecode($_SERVER["QUERY_STRING"] );   $_session["calltype"] = $_SERVER['HTTP_ACCEPT'];   $_session["bwztype"] = $_SERVER['HTTP_USER_AGENT'];    :   // ブラウザ判別 処理 → $call に結果を入れる    :   // 以下 header()の処理   if (            // <aと<img の区別がつく場合     :     :   }else{    // 区別がつかない場合 →「出来るだけ救う」    if (substr($_session["qstr"],0,2) == '//'){  //コマンド      // こう来た時はHtmlの場合が多い。<aと書くようReadmeに記述してあるので      header("Content-Type: text/html; charset=SJIS");    }else if ($_session["qstr"] == "" ) {   //何の指定もない       header("Content-Type: text/html; charset=SJIS");      exit; // 何の指定もなければ、空の画面でよい    }else{   // 数式      // こう来た時はgifの場合が多い。<imgと書くようReadmeに記述してあるので      header('Content-Type: image/gif');    }   }   // 初期設定   require_once '../config.inc.php';  // mimeTeXのURL等を定義   ini_set('allow_url_fopen', 1);   mb_language("Japanese"); try{   // encodingの判定     :

その他の回答 (2)

回答No.3

色々考えてみましたが、スマートでない方法なら思いつきました。 $_SERVER['HTTP_REFERER'] から、リファラーを取得して、 file_get_contents関数なり、fsockopen関数なりで、HTMLを取得してきて、 aタグとIMGタグをパーサなり、正規表現などを使って取得してきて、 そのリクエストされた値付のリンクがどちらで記述してあるかを判別する。 ・・・そこまでする意味があるかといわれるとアレですが。

morimot703
質問者

お礼

実は、最初この方法を試してみたのですが、 YahooのCGI環境(Geocities)では、file_get_contents関数で取得される サイズは、約44kまでなのです。 しかし、Yahooブログは、72kもあり、Upした記事は、最後の方なのです。 というわけで、この方法は、使えませんでした。 >そこまでする意味があるかと そうですね。 fsockopen関数は、よく知らないし、、、 商用ソフトじゃない と、わりきることにします。

  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.1

一番簡単なのは$callそのものをリンクに組み込んでしまうことなんですが、そんな回答を望んでいる訳ではないですよね‥‥。 >だいたいは、出来ています。 良くできていますねー感心しました。

morimot703
質問者

お礼

お褒め頂いて、恐縮です。 量子力学のブログなんかやってますが、元SEです。 Javaでのイントラネットの経験はあるのですが、phpは、初めてで、 まして、<img で呼び出すのを作ったのは初めてです。 よろしくお願いします。 このCGIは、ユーザのブログやHPに(ユーザが書いて)置くものですから、 >$callそのものをリンクに組み込む のでは、それを書き間違える可能性は、十分あります。 で、<img で書いた時は、(例え間違えても)ユーザは画像が出ることを期待してますし、 <a で書いた時は、(例え間違えても)それなりのHtmlが出ることを期待してます。 グチャグチャが出れば、まず当方のバグを疑われます。 というか「ソフトウエア製品」とみなしてもらえません。 ( 「仕様通り」で突っぱねるのは、僕は嫌いです ) 何とかなりませんか、、、

関連するQ&A

専門家に質問してみよう