![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
現在、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行はいりません。
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」
でした。
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行はいりません。
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/');
}
仰るとおり、階層がバラバラのものですが、ローカルのPHP実行環境は方法がいまいち分からずにいますので、環境を整えれた時に使用してみます。
わざわざ、ご回答ありがとうございました。
No.1
- 回答日時:
ヒント : $_SERVER[SERVER_NAME];
ヒント : $_SERVER[SCRIPT_NAME];
ヒントありがとうございます。
悩んだ末、
define(SITE_URL, $_SERVER[SERVER_NAME]);
で、惜しいとこまでいけました。
後一歩、http://と/mobile/を付け加える方法が分からず、この式に直接打ち込める方法などを検索してみています。
課題としていい問題になりましたので、できるのかできないのかを引き続き探してみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP PHP ページング データベース 1 2022/06/16 10:30
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
wordpressのルートのindex.php...
-
PHP/icludeを使った相対パスの...
-
深い階層のフォルダの作成や削...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
PHPで新しいウインドウで開く命...
-
別ファイルの変数を呼び出した...
-
バッチを用いたフォルダの自動移動
-
php.ini を設定を変更すると再...
-
form actionで二つ送信先を指定...
-
phpの中でphpを書けないか
-
「@$変数」の「@の意味は?」
-
リダイレクトでPOST
-
PHPで、エラーがない場合のみ画...
-
フォームで戻った際に入力済み...
-
Subversionのリポジトリの削除
-
PHP8を使うと、大量のWarningが...
-
VBSの「MsgBox」について
-
php5.6でsimplexml_load_string...
-
VBでクラウドストレージにア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
index.phpに入るには、どうすれ...
-
include時の頭の良いパス指定に...
-
require_onceで読み込む場合、...
-
深い階層のフォルダの作成や削...
-
サイトパスに使用しているURLを...
-
.htaccessファイルの修正がこれ...
-
1つのcakePHPで複数のサイトを...
-
[PHP] 任意のDNSでIPアドレスを...
-
phpでページ分けする方法を教え...
-
PHP Linux から Windowsへの移行
-
zendのcontrollersについて
-
ゼンド フレイムワークがどうや...
-
mod_rewite?でのリダイレクト...
-
万国博覧会
-
歴史上の人物や宗教
-
PHPファイルが、そのまま見えて...
-
SSLに設置したらディレクトリパ...
-
変数値の渡し
-
ラミネート加工について
-
__FILE__をHTMLタグ内で使う
おすすめ情報