SSLと非SSL対応、且つ複数階層対応の記述方法

このQ&Aのポイント
  • SSLと非SSL対応、複数階層に対応するためにはどのように記述すれば良いのかわからない
  • 相対パスでは複数階層に対応できず、絶対パスの使用が必要
  • httpsまたはhttpを取得し、それに基づいて分岐させることで対応可能
回答を見る
  • ベストアンサー

SSLと非SSL対応、且つ複数階層対応の記述方法

SSL対応のホームページにアクセスしたところ、「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。保護されていない項目を表示しますか?」というダイアログが表示されました。 なお、このダイアログは下記に記載されている方法で表示を抑止できました。 http://www.netmania.jp/colum/make/000370.php ただし、1つの記述で複数階層に対応したい場合、どのように記述すれば良いかわからなかったので、アドバイスいただける方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 私が考えたかぎりでは、相対パスでは複数階層に対応できず、絶対パスにする必要があると思いました。 そのため、サイトにアクセス時のアドレスがhttpであること、又はhttpsであることを取得できれば、それを元に分岐させれば良いのではと思ったのですが、どのようにすればhttpやhttpsを取得できるのかが分かりませんでした。 なお、ソースは下記となります。 また、考え方自体に問題があるようでしたら、その旨ご指摘いただければと思います。 <?php //if() { // HTTPSの場合、そのアドレスを取得する(ここの取得方法が分かりません)。 $protocol = "https"; //} else { // HTTPの場合、そのアドレスを取得する(ここの取得方法が分かりません)。 $protocol = "http"; //} // ここの取得方法が分かりません。 $protocol .= "://localhost/"; // デバッグ用 echo $protocol; ?> <img src="<?php echo $protocol; ?>sample.gif" /> それと、環境は下記のような感じとなります。 1. https://localhost/hoge1.html 2. https://localhost/hoge/hoge2.html 3. https://localhost/sample.gif ちなみにhtmlや画像は他にも複数階層あります。 以上、よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

基本的に、環境変数を見ます。($_SERVER変数ですね) 共有SSLとか、レンタルサーバだったりするとまた色々対策を取らなければいけないんですが、 SSLでのアクセスか判断する材料として、 $_SERVER['HTTPS'] === 'on' →HTTPSというキーに「on」が入っているかどうかで判断。普通のHTTPプロトコルの場合は、存在自体しないので isset($_SERVER['HTTPS'])で確認するのもありかも。 $_SERVER['SERVER_PORT'] == '443' →サーバのポートを見て、80だったら通常のHTTP、443だったらSSLと判断します。 ※番外編で、さくらインターネットの共有SSLの場合、どちらも入ってこないので、 isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR']) この環境変数が吐かれているかどうかで判断出来るとのことでした。 また、上記のような方法でSSLか否かの判別ができたら、HTMLの記述に、「base」タグというものがあるので、 <base href="<?php echo $uri?>" /> としてやって、相対パスで記述されたURIの基準となるURIを指定してやることで、普通に相対パスで引けます。 http://www.htmq.com/html/base.shtml 後は、PHPで判断する必要がなくなる方法として、相対パスの記述方法で、 <img src="/yourdir/img/filepath.jpg" /> などと、頭に「/」から始めるように記述すれば、プロトコルに関係なく、ドメイン以下のディレクトリに対して絶対パスが引けます。

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいた3点すべての方法で意図した動作になりました。 このたびはどうもありがとうございました。

関連するQ&A

  • 複数コマンドを実行するには

    一回で完結しないコマンドはどのように書けば、実行できるのでしょうか? たとえば、下記のようにコマンドを実行して、受信メールを表示させたいのですが、方法が分かりません。 ------------------------- telnet localhost pop3 user hoge@hoge.com pass hoge retr 1 ------------------------- 一回で完結していないので、当たり前かもしれませんが、 下記のようにやっても、エラーがでてしまいます。 ------------------------- shell_exec('telnet localhost pop3'); shell_exec('user hoge@hoge.com'); shell_exec('pass hoge'); echo shell_exec('retr 1'); -------------------------

    • ベストアンサー
    • PHP
  • PHPの記述方法について

    PHPの記載方法でデータベースからの引数を用いているのですが 別ウインドウでリンク先を開くように設定したいのですが 文法エラーが表示されます。javascript とPHPの組み合わせの記載方法についてご享受くださいませ。 タグは下記のようになっています。 <a href="coupon.php?shop_cd=<? echo $shop_cd; ?>&rt=b" onclick="openWin('coupon.php?shop_cd=<? echo $shop_cd; ?>&rt=b');return false;" onkeypress="openWin('coupon.php?shop_cd=<? echo $shop_cd; ?>&rt=b');return false;" title="新しいウィンドウを開きます" target="_blank"><img src="coupon.gif" </a>

    • ベストアンサー
    • PHP
  • swfファイルがhtmlファイルよりも上位階層にある場合の設定方法

    1つのswfファイルを複数のhtmlで使うため、下記の階層にしています。 hoge.swf  +1   +index.html  +2   +index.html  +3   +index.html 単純に相対パスで指定してもダメでした。 <param name="movie" value="../hoge.swf" /> そもそも読み込むことが可能なのでしょうか? 可能でしたら指定方法を教えてください。

    • ベストアンサー
    • Flash
  • 1つのIPアドレスでサブドメインをSSLにするには

    1つのIPアドレスでサブドメインをSSL通信にしたいと思います。 https://www.hoge.com https://geho.hoge.com しかしIPはひとつです。 その場合ジオトラストでワイルドカード証明書(サブドメインなら 無制限に増やせる)を取得して設定をしてみましたが設定がうまく行き ません。 流れとしてcentos5でhttpd.confにVirtualHostを設定しました。 こんな感じです。 <VirtualHost *:80> ServerAdmin admin@hoge.com DocumentRoot /var/www/www.hoge.com ServerName www.hoge.com ErrorLog /var/log/www.hoge.com.err CustomLog /var/log/www.hoge.com.log combined </VirtualHost> CSRを作成して認証してもらいssl.confの設定しました。 # General setup for the virtual host <VirtualHost *:443> DocumentRoot "/var/www/www.hoge.com" ServerName www.hoge.com:443 鍵も下記のように変更しました。 SSLCertificateFile /usr/local/certs/server.crt SSLCertificateKeyFile /usr/local/certs/server.key それでもなぜかドメインは一つかしか使えず、さらにhttpsで アクセスするとIEでは 「このページにはセキュリティで保護されている項目と保護されて いない項目が含まれます」 とエラーがでます。 サイトはPHPで構築したものですが小規模なサイトです。 非常に困っておりSSL通信をVirtualHost毎に行いたいと思います。 どうすれば良いかまったくわからない状態です。 アドバイスのほどよろしくお願いします。

  • PHPでのドキュメントルート指定方法

    PHPでのドキュメントルートの指定方法がうまくいかず困っています。 マルチドメインで組んでいます。 公開ディレクトリのルートは /home/hoge/www になります。 wwwの中に/piyo/でマルチドメインを組んでいます。 →絶対リンクを/home/hoge/www/piyo/ ここに指定したいです。 あるサイトを見てcommon.phpを作成し、index.phpと同じ階層に置き、index.phpの頭に <?php include 'common.php'; ?> を指定すると設定ができると記載されていたので下記の様に設定しました。 // common.php // <?php // サーバー上の絶対パスを記入 // これは公開ディレクトリのルート(サイトのルートディレクトリ)と一致 $__DOC_ROOT__ = '/home/hoge/www/piyo/ <http://piyo.co.jp/> '; ?> // index.php // <?php include 'common.php'; ?> <!doctype html> <html lang="ja"> … <?php echo $_SERVER['DOCUMENT_ROOT']; ?> … </html> echoで呼び出してみましたがサイトのルートディレクトリが /home/hoge/www こちらになり変更されていませんでした。 これを /home/hoge/www/piyo/ に変更したいと思います。 ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 複数選択の項目をPHP側でArrayで受け取る方法。

    PHPで開発の際、HTMLのフォームで複数選択の項目を、PHP側でArrayで受け取る際、フォームの項目のnameを、例えば、<input type="checkbox" name="hoge[]"> のように [] を入れないとダメなんですか? 以前、Perlをやっていまして、ちょっとショッキングです。他にも方法はありますか?もしあるなら、一番標準てきな方法はどういった方法でしょう。 [] と書くと、その項目が単数か複数かという情報をHTML側に依存させてしまう印象を受けます。 (どちらにせよ、checkboxやradioと書いている時点で、単数複数の情報をもたせてしまってますが・・・)

    • ベストアンサー
    • PHP
  • srcに「banner.」で始まるファイルを指定しているimgタグが消える

    急に謎の症状が発生して困っています。 何か知っている方がいたらご教示お願いします。 謎の症状が起きるスクリプトの例------------------------ echo '<div>'; echo '<a href="hoge1"><img src="img/banner.jpg"></a>'; echo '<a href="hoge2"><img src="img/banner2.gif"></a>'; echo '<a href="hoge3"><img src="banner.gif"></a>'; echo '<a href="hoge4"><img src="banner.png"></a>'; echo '<a href="hoge5"><img src="hogehoge.gif"></a>'; echo '</div>'; ------------------------------------------------------ 上記のようなスクリプトを実行した場合に、3行目の「img/banner2.gif」と6行目の「hogehoge.gif」を指定しているimgタグしか表示されません。 残りはimgタグの部分だけ綺麗さっぱりに消えてaタグの部分だけ表示されます。実行結果が下記のようになるのです。(実際には改行されませんが、見やすいように改行してます。) 実行結果--------------------------------------- <div> <a href="hoge1"></a> <a href="hoge2"><img src="img/banner2.gif"></a> <a href="hoge3"></a> <a href="hoge4"></a> <a href="hoge5"><img src="hogehoge.gif"></a> </div> ----------------------------------------------- banner.gifやimg/banner.gifは表示されるファイルと同じディレクトリの中に存在しています。 昨日ちゃんと表示されていたのを確認しました。そのときからサーバーの設定は変更していないので、何が原因なのかが分かりません。 過去に同じような症状が起こった方はいないでしょうか? PHPのエラーログを見てもエラーも警告もありませんでした。 【環境】 OS: CentOS/5 HTTPD: Apache/2.2.3 PHP: PHP/5.1.6(eAccelarator、ZendOptimizerが入ってます) ちなみに「banner」だけだとOKでした。「banner.」が付くとダメみたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • GETで?の後ろのnameをなしにしたい

    【PHP】 GETでパラメータを取得したいです。 通常、 hoge.php?q=hogehoge ↓ echo $_GET["q"]; ↓ hogehoge などとなりますよね? でも、 hoge.php?hogehoge ↓ echo $_GET["●●"]; ↓ hogehoge 出力、みたいにしたいのですが.. hoge.php?hogehoge&mogemoge とか hoge.php?hogehoge&a=mogemoge とかできたら尚良いです。 どうしたらいいのでしょうか? ●●部分を空白にする、とか? 仕様的に無理なんでしょうか? ご教示頂けましたら幸いです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • requireやinclude時の階層の書き方

    ずっと困ってます。よろしくお願いします。 読み込む大元のファイル名がindexだとして、その中にrequireを書くとします。 そこからrequireするファイルはindexと同階層にあるaフォルダにあるreq1.phpとします。 さらにreq1.phpからrequireするファイルがあり、同階層(aフォルダ内)にあるreq2.phpとします。 req2.phpはなぜかindexと同階層と、aフォルダ内の、計2カ所に同名の同じファイルがあるとします。 コードを書くと、 index内でrequire_once('a/req1.php'); req1.php内でrequire_once(dirname(__FILE__).'/req2.php'); としています。 この場合、読み込まれるreq2は、req1と同階層にあるものではなく、indexと同階層のものが読み込まれてしまいます。また、indexと同階層のreq2を消しておけば、req1と同階層に置いてあるreq2が読み込まれます。 この辺の挙動が、なぜこうなるのかを説明してください。 特に、 1.dirnameとの関係について 2.別階層に同名ファイルが複数存在の有無に関係なく、とにかくrequireする階層を確実に1つだけに限定する方法について(dirnameではうまくいかないような気がします) の2点は詳しく知りたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • モバイルブログへタグを記述する方法

    自前でアクセスを取得しようと考え、各ブログサービスに HTMLタグを記述したのですが、PC版では問題ないのですが、 モバイルで見るとタグが消えてしまいます。 記述したタグは以下になります。 <img src="hoge.php"> やりたい事はhoge.phpへリクエストを発行したいのですが、 うまくいきません。 (FC2では「画像」という文字列に置換されてしまいます) imgタグ以外で他に方法はありますでしょうか?

専門家に質問してみよう