外部サーバーのPHPをIMGタグで呼び出す場合

このQ&Aのポイント
  • 外部サーバーのPHPをIMGタグで呼び出す方法についての質問です。
  • 2つのサーバーでサイトを運営しており、GoogleAnalytics以外の方法でアクセス解析を行いたいと考えています。
  • ログ収集用のPHPを片方のサーバーに設置し、もう片方のサーバーのサイトでIMGタグを使用してログを収集しようとしています。しかし、いくつかの問題が発生しているため、解決方法を知りたいです。
回答を見る
  • ベストアンサー

外部サーバーのPHPをIMGタグで呼び出す場合

外部サーバーのPHPをIMGタグで呼び出す場合の質問です。 2か所のサーバーでサイトを運営しており、今までGoogleAnalyticsでアクセス解析をしていたのですが、Javascriptを無効にしているひとの数も収集しておきたく、ド素人ですが思い切ってPHPでログ収集をしようとしています。 ただ、あっちこっちにログファイルを残しておきたくなかったので、片方のサーバーにログ収集用のPHPを設置し、もう片方のサーバーのサイトのログも以下のような方法で収集しようと考えています。 【http://hoge.jp/サイト.html】 <!DOCTYPE html> <html lang="ja-JP"> <head>  ~ </head> <body> ※コンテンツ <img src="https://huga.jp/収集.php" /> </body> </html> 【https://huga.jp/収集.php】 <?php //画像の作成 $img = imagecreatetruecolor(1, 1); $backGroundColor = imagecolorallocate($img, 255, 255, 255); imagefill($img , 0 , 0 , $backGroundColor); //画像出力 header("Content-type: image/png"); header("Cache-control: no-cache"); imagepng($img); //後始末 imagedestroy($img); //アクセスログ取得 $h = $_SERVER["HTTP_HOST"];// どのサイトのアクセスか分かりやすくするためにアクセスしたサイトのドメインを取得したいのです… $ap = $_SERVER["REQUEST_URI"];// 同じくアクセスページを分かるようにしたいのです… $rf = $_SERVER['HTTP_REFERER'];// できればどこからきた人かわかるようにしたいのです… ~ //アクセスログ吐き出し ~ ?> アクセスログ自体は吐き出されているのですが、コンソールに出るエラーと、吐き出されている内容に問題が発生し、ググりながら色々いじくってみたのですがまったく解決できずに困っています。 そこで質問なんですが、 (1)実際にhttp://hoge.jp/サイト.htmlにアクセスしてみた際、コンソールに「Refused to execute script from 'https://huga.jp/収集.php' because its MIME type ('image/png') is not executable.」というエラーが表示されます。MIME typeをどーにかしろってことだとは思うのですが、色々検索してみるのですがよくわからず、解決方法をご指南いただけませんでしょうか? (2)別サーバーに設置したPHPではHTTP_HOSTとREQUEST_URIとHTTP_REFERERはうまく取得できないのでしょうか?もしできるやり方があれば御指南いただければと思います。ちなみに、現状では ・HTTP_HOST=「huga.jp」(hoge.jpになってほしい) ・REQUEST_URI=「/収集.php」(サイト.htmlになってほしい) ・HTTP_REFERER=「http://hoge.jp/サイト.html」(アクセス元のページURLになってほしい) のようになってしまします。多分アクセスしたサイトが収集.php扱いになってしまっているのでしょうが、これってどうにかできるんでしょうか? 何分PHP自体ド素人なもので、用語なんかも明るくありませんので、とわかりにくい説明になっていたら申し訳ないのとともに、プロの方からすれば「こんなしょーもないことで?」と言われてしまいそうですが、どうぞよろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.1

まず、いちいち GD で画像を生成するのはリソースの無駄遣いなので、予め PNG ファイルをサーバに用意しておいて readfile() で出力するといいんじゃないでしょうか。 (1)PNG画像の場合、 MIME-Type は image/png で問題ありません。 出力された画像データに PHP のエラーメッセージや不要な空白・改行等が混入してブラウザ側で正しく画像と認識されていないと言う事はありませんか。 もし画像データに問題がなければ、URLに書かれているファイル名の拡張子と一致していない事が原因かもしれませんね。 (2)どうにもできません。 HTTP_HOST はPHPが動作しているサーバで、HTTPリクエストヘッダーから取得するので、収集.php が動作しているサーバのホスト名が入ります。 REQUEST_URI もPHPが動作しているサーバで、HTTPリクエストヘッダーから取得するので、収集.php のリクエスト内容が入ります。 HTTP_REFERER はブラウザが「https://huga.jp/収集.php」へリクエストを送る際に付けたヘッダーに書かれているリファラーなので、ブラウザ側の問題です。 表示しているページに対して第三者となるサーバでは必要な情報が収集できないためGoogleアナリティクスをはじめ多くのアクセス解析はJavaScriptを使って情報を収集するのです。

komarick
質問者

お礼

> PNG ファイルをサーバに用意しておいて readfile() で出力するといいんじゃないでしょうか。 なるほど!ということで、とりあえずやってみましたら、うまくいきました! しかも(1)もなぜか解消…なぜだろう…。 まぁ解消したからいいのでしょうか? (2)の件はやっぱりどうにもできないんですねぇ。 解説頂いた内容もなるほど納得です。 やっぱり面倒くさくてもそれぞれのサーバーにログ収集用のPHPを置くかApacheの生ログを解析するしかないんでしょうか。 Javascriptをブラウザ設定で無効にしている人のアクセス状況の確認はみなさんどうしてるんでしょうか?

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.3

> しかも(1)もなぜか解消…なぜだろう…。 > まぁ解消したからいいのでしょうか? たぶん、元の GD を使った処理でエラーが発生していて、PHPのプログラムから出力されていたのが画像データではなく、エラーメッセージが書かれたテキストデータだったため、Content-type に書かれているデータの種類と実際に受け取ったデータに齟齬があったため警告が出ていたのでしょう。 PHPのプログラムから返ってくるデータが PNG 形式の画像データに直ったためコンソールに警告メッセージが出なくなったのです。 サーバ内のエラーログを見るなどして確認してみれば判ります。

komarick
質問者

お礼

おぉ!なるほど! そういうことなんですね。 すごく勉強になります。 本当にわかりやすくご説明いただきありがとうございます! とりあえず、お二人からいただいた情報を元に、別サーバーでリファラ情報などを取るのは無理がある、ということがわかってきましたので、各サーバーでそれぞれログ収集のPHPを設置し、各サイトではGoogleAnalyticsのScriptタグにnoScriptタグでIMGに埋め込んだPHPを呼び出す、という方向でチャレンジしてみようと思います。 本当にありがとうございました! ベストアンサーは、お二方とも非常に参考になったのですが、一番早くとても丁寧な解説をいただきましたt_ohtaさんにさせていただきます。

回答No.2

(1) ChromeのコンソールにJavaScriptのエラーがでるということでしょうか? http://hoge.jp/サイト.html  内に  <img src="https://huga.jp/収集.php" /> だけでなく、 <script src="https://huga.jp/収集.php">とか 誤って書いてしまって、 JavaScriptとしてexecuteさせようとしまっていませんか? (2) リンク元 ↓ http://hoge.jp/サイト.html ↓ https://huga.jp/収集.php のリンク順ですから、huga.jp/収集.php にとっての HTTP_HOSTは 自身のhuga.jp REQUEST_URIは、自身の /収集.php HTTP_REFERERは、自身へのリンク元のhttp://hoge.jp/サイト.html になりますね。 目的のものを手に入れたかったら ・http://hoge.jp/サイト.html をphpに変更して、 その中でHTTP_HOST等のログに必要なデータを  src="https://huga.jp/収集.php?HTTP_HOST=$_SERVER['HTTP_HOST']&REQUEST_URI= ....."のようにGETデータで引き渡し 収集.phpを$_SERVERから$GET_に変更するか。 ・収集.phpで$_SERVER['HTTP_REFERER']から HTTP_HOST,REQUEST_URI相当の値を自前ででっち上げて、REFERERは諦めるか。 って感じになるんじゃないかな。

関連するQ&A

  • mod_rewrite的なことをphpで実現させたいが空白ページが表示されてしまう

    www.example.com/ほげほげ にアクセスされたら、 example.com/ほげほげ へ urlをかきかえ、 さらに、 $_SERVER["REQUEST_URI"] がスラッシュで終わる(2個以上のスラッシュも考慮)ときは、これらのスラッシュをとりのぞいたurlへかきかえ、 そして、このurlへ301ステータスコードでリダイレクトさせる(ただし、get methodの場合に限る) というコードをphpで書いたのですが、 なぜか、urlは書き換わらず、空白のページが表示されてしまいます。 どこがいけないのでしょうか? お助けくださいませ。         if ($_SERVER["REQUEST_METHOD"] == "GET"){             #HTTP_HOST (exclude www.)             preg_match_all("/^(www\.)(.*)$/", $_SERVER["HTTP_HOST"],$matches_HTTP_HOST);             if ($matches_HTTP_HOST[1] != ''){                 $bWillBeRedirected = true;                 $strAfterRedirect_HTTP_HOST = $matches_HTTP_HOST[2];             }             else{                 $strAfterRedirect_HTTP_HOST = $_SERVER["HTTP_HOST"]             }             #REQUEST_URI (,which includes query string)             preg_match_all("/^(\/)(.*)(\/+)$/", $_SERVER["REQUEST_URI"],$matches_REQUEST_URI);             if ($matches_REQUEST_URI[3] != ''){                 $bWillBeRedirected = true;                 $strAfterRedirect_Request_URI = $matches_REQUEST_URI[1] . $matches_REQUEST_URI[2];             }             else{                 $strAfterRedirect_Request_URI = $_SERVER["REQUEST_URI"];             }             #redirect with 301 status code if needed             if($bWillBeRedirected){                 #Protocol                 if ($_SERVER["HTTPS"] == "on"){                     $strProtocol = "https";                 }                 else{                     $strProtocol = "http";                 }                 $url = $strProtocol . "://" . $strAfterRedirect_HTTP_HOST . $strAfterRedirect_Request_URI;                                                   header("HTTP/1.1 301 Moved Permanently");                 hearder(”Location: “.$url);                 header(”Connection: close”);             }         }

    • ベストアンサー
    • PHP
  • htmlにコードを貼り、リファラーを取得したい

    外部のhtmlページに以下のコードを貼り付け、リファラーとアクセスページを取得しようと思っているのですが、うまくいきません。 ▼ htmlページに貼り付けたコード(外部サーバ) <script type="text/javascript" src="http://example.com/script.php"></script> ▼ script.php の 中身(自サーバ) $access_url= 'http://' . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI]; $referer_url = $_SERVER["HTTP_REFERER"]; [現在の状態] $access_url の中身 = http://自サーバのドメイン/script.php $referer_url の中身 = http://コードを貼り付けたページ 色々と試行錯誤してこの形になったのですが、完全に行き詰ってしまいました。 方向性だけでも良いので、どなたかご教授いただけませんでしょうか。 よろしくお願いいたしますm( _ _ )m

    • ベストアンサー
    • PHP
  • phpについて

    すみません。 echo (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; こちらのコードの意味はわかるのですが emptyに?がついている意味がわかりません。教えて下さい。 これを解説してあるページとか検索用語などでも構いません。よろしくお願いします。

    • ベストアンサー
    • PHP
  • WEBサーバーのアクセスログについて

    お世話になります。 XserverでWordPressサイトを公開しています。 アクセスログについて教えてください。 リクエストラインに下記のようなURIのないアクセスがあります。 "GET / HTTP/1.1" これはどこにアクセスしているものなのでしょうか? よろしくお願いします。

  • WEBサーバーのアクセスログについて

    お世話になります。 XserverでWordPressサイトを公開しています。 アクセスログについて教えてください。 リクエストラインに下記のようなURIのないアクセスがあります。 "POST / HTTP/1.1" これはどこにアクセスしているものなのでしょうか? よろしくお願いします。

  • httpsでmod_rewriteができない

    はじめまして。 Linux環境で、apacheのhttp.confにmod_rewriteを記載し、httpsとhttpを切り替えたいと思っています。 httpd.confに以下のように記述しています。 <IfModule mod_rewrite.c> RewriteEngine on  #(1)httpで/aaaa/bbbbにアクセスされたときにhttps://~に変えたい RewriteCond %{REQUEST_URI} ^/aaaa/bbbb RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R]  #(2)httpsで/cccc/ddddにアクセスされたときにhttp://~に変えたい RewriteCond %{REQUEST_URI} ^/cccc/dddd RewriteCond %{HTTPS} on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R] </IfModule> 上記(1)のhttpでのアクセス時には、mod_rewriteが効いてhttpsへ切り替えられるのですが、 上記(2)のhttpsでのアクセス時には、mod_rewriteが効いていないようでhttpへ切り替えられません。 rewriteログを見てみると、当サイトへhttpでアクセスした場合にはログが出力されますが、 httpsでアクセスした場合には出力されません。 そもそもhttpsでのアクセスの場合にhttpd.confのmod_rewriteが効いていないようです。 ですが、これに対しどこを調査すべきかが分かっていません。 SSLの設定自体は出来ていると思っていて、 https://xxxx.jpのようにアクセスするとちゃんとページが表示されます。 どの当たりに問題がありそうでしょうか? 解析のヒントを頂けたらと思います。 宜しくお願い致します。

  • au端末でのHTTPS⇒HTTP時の挙動について

    LAMP環境で携帯端末向けWEBシステムの開発をしております。 標題の件についてご教示いただけましたら幸いです。 ユーザが個人情報を登録するフォームを備えたサイトになっていまして、 登録フォームのページが https://www.hogehoge.jp/form.php それ以外のページが http://www.hogehoge.jp/hoge.php となっています。 フォームのページにアクセスした場合にHTTPSにRewriteするため、.htaccessファイルに 以下のように記述いたしました。 ━━━━━━━━━━━━━━━━━━━━ RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} ^/form\.php(.*)$ RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] RewriteCond %{REQUEST_URI} !(^/form\.php(.*)$) RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L] ━━━━━━━━━━━━━━━━━━━━ フォームのページへアクセスした場合は意図した動作(http://www.hogehoge.jp/form.php にアクセスするとhttps://www.hogehoge.jp/form.phpにRewriteされる) をするのですが、フォームのページからその他の非SSLページへリンクを辿った際に au端末のみ「リクエストされたページは表示できません」(403?)エラーとなってしまいます。 メニューからURLを確認すると、au端末のみ http://www.hogehoge.jp:443/ とポート番号がついていましたのでこのあたりが原因かと思われるのですが、 良い対応方法をご存知の方、おられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • IMGタグの中にPHP

    こんばんは,最近PHPを勉強し始めて色々なサイトを見て回っているのですが,時折IMGタグの中に <img src="xxx.php?abc=012">のような形でphpが指定されていることがあります.HTMLの表示では,アクセスする度にこの部分の画像が入れ替わったりします. これはどういう動作をするのでしょうか.いくつか入門書を購入して勉強しているのですが,<?php~?>という風に書くんだよということしか掲載されておらず,上記の記述がどういう動作をするのか理解できません. また,オススメの参考書籍,ウェブサイトなど併せて教えていただけると嬉しいです.よろしくお願いします.

    • ベストアンサー
    • PHP
  • wwwありかつhttpsへリダイレクトさせたい

    .htaccessに以下の記述をしていますが、 ブラウザでURLに”xxxx.jp”と"http://xxxx.jp"と入力してアクセスすると、 https://xxxx.jpにリダイレクトされてしまます。 ドメインxxxx.jpを.htaccessに記載せずにhttps://www.xxxx.jpにリダイレクトさせる記述をご存知でしょうか? wwwありの場合"www.xxxx.jp"、"http://www.xxxx.jp"は意図したとおり”https://www.xxxx.jp"に転送されています。 --- RewriteEngine On RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ---

    • 締切済み
    • CGI
  • リファラが取得できない?

    初めまして。PHPのメールフォームを設置し お試しをしてみたら、外部から利用はできません、と表示されます。 リファラのチェックをする、に設定しています。 (お借りした所ではこういう質問を受け付けてもらえないので こちらでお伺いしております) リファラの意味がわからず調べてみましたが、 「あるWebページのリンクをクリックして別のページに移動したときの、リンク元のページのこと。Webサーバのアクセスログに記録される項目の一つ。」 リファラとは 【referer】 - 意味・解説 : IT用語辞典 <http://e-words.jp/w/E383AAE38395E382A1E383A9.html> とあり、自分のページからメールフォームにリンクしているのは 大丈夫なのではないかと思っていたのですが・・・ 他にブラウザの設定やファイヤーウォールの設定も見てみましたが リファラを消したりすることも無いようです。 本体?の中に、 if ($_SERVER['HTTP_REFERER'] != 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] && $refCheck) { Err('外部から利用は出来ません'); と記載している箇所を見つけたので、http://の箇所に自分のアドレスを入れるのかと思い試してみましたがダメでした。 拙い説明でわかりづらいところばかりですが おわかりになる方がおられましたら、対処法などお教え下さい。 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう