php内で、標記を切り分けて、
imgタグなら?指定に従った画像を、aタグなら?指定に従ってHtmlを出したいのです。
(imgタグの方が主機能です。Htmlにはリンクを入れる必要があるので、
imgに統一できません)
常に header('Content-Type: image/gif');
でよいように思えますが、?以降を間違えられた時、
クリックすると、メチャメチャな画面が出てしまいます。
$_SERVERを、Googleって見ましたが、わかりません。
ご教授お願いします。
尚、切り分けた後は、($callで判定できるとすると)
if ($call == "img"){
header('Content-Type: image/gif');
:
(Img作成の処理)
:
}else if ($call == "a" || GETやPOST){
header("Content-Type: text/html; charset=SJIS");
:
(Html作成の処理)
:
とするつもりです。
そもそも、何をしたいかというと、
?以降にLaTeXの数式を書けば、(mimeTexを呼んで)イメージを返したい
のです。
だいたいは、出来ています。
http://blogs.yahoo.co.jp/kafukanoochan/62474900. …
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経由相当になりますので、
画像として表示することはできなくなります。
ご調査頂きありがとうございます。
>使われる可能性のあるブラウザ
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の判定
:
No.3
- 回答日時:
色々考えてみましたが、スマートでない方法なら思いつきました。
$_SERVER['HTTP_REFERER']
から、リファラーを取得して、
file_get_contents関数なり、fsockopen関数なりで、HTMLを取得してきて、
aタグとIMGタグをパーサなり、正規表現などを使って取得してきて、
そのリクエストされた値付のリンクがどちらで記述してあるかを判別する。
・・・そこまでする意味があるかといわれるとアレですが。
実は、最初この方法を試してみたのですが、
YahooのCGI環境(Geocities)では、file_get_contents関数で取得される
サイズは、約44kまでなのです。
しかし、Yahooブログは、72kもあり、Upした記事は、最後の方なのです。
というわけで、この方法は、使えませんでした。
>そこまでする意味があるかと
そうですね。
fsockopen関数は、よく知らないし、、、
商用ソフトじゃない と、わりきることにします。
No.1
- 回答日時:
一番簡単なのは$callそのものをリンクに組み込んでしまうことなんですが、そんな回答を望んでいる訳ではないですよね‥‥。
>だいたいは、出来ています。
良くできていますねー感心しました。
お褒め頂いて、恐縮です。
量子力学のブログなんかやってますが、元SEです。
Javaでのイントラネットの経験はあるのですが、phpは、初めてで、
まして、<img で呼び出すのを作ったのは初めてです。
よろしくお願いします。
このCGIは、ユーザのブログやHPに(ユーザが書いて)置くものですから、
>$callそのものをリンクに組み込む
のでは、それを書き間違える可能性は、十分あります。
で、<img で書いた時は、(例え間違えても)ユーザは画像が出ることを期待してますし、
<a で書いた時は、(例え間違えても)それなりのHtmlが出ることを期待してます。
グチャグチャが出れば、まず当方のバグを疑われます。
というか「ソフトウエア製品」とみなしてもらえません。
( 「仕様通り」で突っぱねるのは、僕は嫌いです )
何とかなりませんか、、、
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- HTML・CSS flex の各子要素を横幅 100% にしたい 1 2022/09/22 21:25
- PHP PHP・Wordpress preg_replaceを条件分岐で処理させる方法が知りたい 1 2023/05/01 14:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
拡張子php画像をjpg画像等に変...
-
どの画像がクリックされたかフ...
-
実行ファイル(exe)に画像ファ...
-
VBSの「MsgBox」について
-
GDI+を使ったビット数とDPIの扱い
-
C# Excelファイルへの画像挿入。
-
VBAでJPGサイズ変更
-
携帯電話から画像ファイルをア...
-
pythonのファイル内に 手書き数...
-
ウィンドウサイズを取得して、p...
-
画像が存在しない時の 「×」 表...
-
10進BASICでの画像回転
-
MYSQLから、画像表示するには
-
アップロード画像数でCSSを分け...
-
ビットマップ画像を読み込むプ...
-
pictureboxに表示した画像のフ...
-
onedrive にexcelファイルをア...
-
こちらはただの直列処理ですか?
-
ワードプレス、Contact Form 7...
-
PHPとCSVで簡易データベースな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの「MsgBox」について
-
拡張子php画像をjpg画像等に変...
-
透過PNGが透過されない!!
-
アップロード画像数でCSSを分け...
-
imageフォルダに、画像をリサイ...
-
VBAでJPGサイズ変更
-
Illustratorで文字と画像を流し...
-
VBAのコードを教えてください
-
C# Excelファイルへの画像挿入。
-
php,mysqlにて画像パス保存/表...
-
GDI+を使ったビット数とDPIの扱い
-
SQLiteに画像を格納したい
-
ListViewコントロールでサムネ...
-
★PHP?★画像を縦横比を変えずに...
-
ビットマップ画像を読み込むプ...
-
phpで画像がどうしても文字化け...
-
PHPで吐き出した画像にリンクを...
-
phpMyAdminに画像を保存できない
-
OpenGLで描いて画像ファイル出力
-
手作業で埋め込んだ、UserForm1...
おすすめ情報