• ベストアンサー

サイトパスに使用しているURLを自動取得させたい。

現在、config.phpにて、初期URLとして <?php define(SITE_URL, "http://www.i-ive.com/mobile/");​ ?> と記載して、menu.phpで、 <a href="<?php echo SITE_URL; ?>" accesskey="7">HOME</a> で、サイトのURLを入力しています。 このconfig.phpで記載した初期URLを、いちいち入力しなくても自動で判別できるようなので、その方法を探しています。 どなたか教えていただけないでしょうか。

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

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

現在のURLが、「http://mydomain12345.jp/mydir/」で、表示しているスクリプトが「index.php」のとき、 $_SERVER配列の中身は、それぞれ $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydomain12345.jp/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydomain12345.jp/mydir/index.php」 となります。 一番やってはいけないのは、$_SERVER[PHP_SELF]をそのまま出力することです。セキュリティ的に脆弱性があります。 また、$_SERVER[PHP_SELF]よりも$_SERVER[SCRIPT_NAME]の方が安全とされてます。 htmlentities(*** , ENT_QUOTES)を通して、サニタイズするとよいでしょう。 入力時よりも出力時にサニタイズすることが大事です。 以下のコードでは、念のため、入力時と出力時の両方でサニタイズしました。 ま、サニタイズして、得することはあっても損することはないので。 以下がコードですが、ここでは「index.php」を取り除きした。 $script_name = htmlentities($_SERVER[SCRIPT_NAME] , ENT_QUOTES); $i = strrpos($script_name , '/'); $script_name = substr($script_name , 0 , $i + 1); で、$script_nameの中身は、「/mydomain12345.jp/mydir/」となります。 $url_name = 'http://' . htmlentities($_SERVER[SERVER_NAME] , ENT_QUOTES) . $script_name; で、$url_nameの中身は、「http://mydomain12345.jp/mydir/」となります。 <a href="<?php echo htmlentities($url_name , ENT_QUOTES); ?>" accesskey="7">HOME</a> とするとよいと思います(最低限、出力時には必ずサニタイズする)。 「index.php」をつけたい場合は、 $i = strrpos($script_name , '/'); $script_name = substr($script_name , 0 , $i + 1); の2行はいりません。

その他の回答 (6)

回答No.7

No.3,4,5です。重複してしまってすみませんでした。 間違いがありました。 $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydomain12345.jp/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydomain12345.jp/mydir/index.php」 ではなくて、 $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydir/index.php」 でした。

egtomo
質問者

お礼

ご回答ありがとうございます。 こちらの方法で解決しました。 PHP初心者の為、分かりやすく説明して頂けて助かりました。

回答No.6

No.3,4です。重複してしまってすみませんでした。 間違いがありました。 $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydomain12345.jp/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydomain12345.jp/mydir/index.php」 ではなくて、 $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydir/index.php」 でした。

回答No.5

ANo.4です。 $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydomain12345.jp/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydomain12345.jp/mydir/index.php」 ではなくて、 $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydomain12345.jp/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydomain12345.jp/mydir/index.php」 でした。

回答No.3

現在のURLが、「http://mydomain12345.jp/mydir/」で、表示しているスクリプトが「index.php」のとき、 $_SERVER配列の中身は、それぞれ $_SERVER[SERVER_NAME] :「mydomain12345.jp」 $_SERVER[PHP_SELF] :「/mydomain12345.jp/mydir/index.php」 $_SERVER[SCRIPT_NAME] :「/mydomain12345.jp/mydir/index.php」 となります。 一番やってはいけないのは、$_SERVER[PHP_SELF]をそのまま出力することです。セキュリティ的に脆弱性があります。 また、$_SERVER[PHP_SELF]よりも$_SERVER[SCRIPT_NAME]の方が安全とされてます。 htmlentities(*** , ENT_QUOTES)を通して、サニタイズするとよいでしょう。 入力時よりも出力時にサニタイズすることが大事です。 以下のコードでは、念のため、入力時と出力時の両方でサニタイズしました。 ま、サニタイズして、得することはあっても損することはないので。 以下がコードですが、ここでは「index.php」を表示させないために、「index.php」を取り除きした。 $script_name = htmlentities($_SERVER[SCRIPT_NAME] , ENT_QUOTES); $i = strrpos($script_name , '/'); $script_name = substr($script_name , 0 , $i + 1); で、$script_nameの中身は、「/mydomain12345.jp/mydir/」となります。 $url_name = 'http://' . htmlentities($_SERVER[SERVER_NAME] , ENT_QUOTES) . $script_name; で、$url_nameの中身は、「http://mydomain12345.jp/mydir/」となります。 <a href="<?php echo htmlentities($url_name , ENT_QUOTES); ?>" accesskey="7">HOME</a> とするとよいと思います(最低限、出力時には必ずサニタイズする)。 ファイル名(ここではindex.php)をつけたい場合は、 $i = strrpos($script_name , '/'); $script_name = substr($script_name , 0 , $i + 1); の2行はいりません。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

相対URLを使用せずに、絶対URLを使うという目的を考えると、複数の、しかも階層がバラバラのPHPから同一のmenu.phpを呼び出されているのだと思います。 過去に同じような事をしようとしていました。 その際には、サイトトップ位置がサーバ名のみの場合でも(独自ドメインのような場合)、フォルダがある場合でもキチンと自動判別するのは不可能である、defineするしかないとあきらめました。 ローカルでのテスト時と、サーバにアップする際、いちいち書き変えなければいけないのを避けたいという事であれば、一応、以下のような方法は考えられます。 if ($_SERVER['SERVER_NAME']=='localhost'){ define(SITE_URL, 'http://localhost/hogehoge/mobile/'); }else{ define(SITE_URL, 'http://hogehoge/mobile/'); }

egtomo
質問者

お礼

仰るとおり、階層がバラバラのものですが、ローカルのPHP実行環境は方法がいまいち分からずにいますので、環境を整えれた時に使用してみます。 わざわざ、ご回答ありがとうございました。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

ヒント : $_SERVER[SERVER_NAME]; ヒント : $_SERVER[SCRIPT_NAME];

egtomo
質問者

お礼

ヒントありがとうございます。 悩んだ末、 define(SITE_URL, $_SERVER[SERVER_NAME]);​ で、惜しいとこまでいけました。 後一歩、http://と/mobile/を付け加える方法が分からず、この式に直接打ち込める方法などを検索してみています。 課題としていい問題になりましたので、できるのかできないのかを引き続き探してみます。 ありがとうございました。

関連するQ&A