dポイントプレゼントキャンペーン実施中!

現在、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を、いちいち入力しなくても自動で判別できるようなので、その方法を探しています。

どなたか教えていただけないでしょうか。

A 回答 (7件)

現在の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行はいりません。
    • good
    • 0

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」

でした。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/03/24 11:21

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」

でした。
    • good
    • 0

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」

でした。
    • good
    • 0

現在の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行はいりません。
    • good
    • 0

相対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/');
}
    • good
    • 0
この回答へのお礼

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

わざわざ、ご回答ありがとうございました。

お礼日時:2010/03/24 11:28

ヒント : $_SERVER[SERVER_NAME];


ヒント : $_SERVER[SCRIPT_NAME];
    • good
    • 0
この回答へのお礼

ヒントありがとうございます。

悩んだ末、
define(SITE_URL, $_SERVER[SERVER_NAME]);​
で、惜しいとこまでいけました。

後一歩、http://と/mobile/を付け加える方法が分からず、この式に直接打ち込める方法などを検索してみています。
課題としていい問題になりましたので、できるのかできないのかを引き続き探してみます。
ありがとうございました。

お礼日時:2010/03/24 11:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!