別のサーバーにインストールすることになっている PHP プロジェクトがあります。プロジェクトのルート ディレクトリに名前が付けられたインクルード ファイルがあり、プロジェクト全体の複数の場所からincludes.php
呼び出すことができます。インクルード ファイルには、関数がどのファイルから呼び出されたかに関係なく、プロジェクト全体の絶対 URL を返す関数が含まれています。file1.php
includes.php
subdir/file2.php
subdir2/file3.php
http://www.myserver.com/myproject/
$_SERVER["REQUEST_URI"]
関数を呼び出すファイルのURLを返すため、使用できません(これは異なります)。この URL 関数を呼び出すことができる場所は非常に多いため、「2 つのディレクトリに移動する」などのパラメータを渡したくありません。- 私たちのサーバーには、のサブディレクトリにないような奇妙な構成があるため、
__FILE__
andを使用できません$_SERVER['DOCUMENT_ROOT']
(これは一部の人に推奨されています) 。(私は自分の学校のためにプロジェクトを書いていますが、他の学校に配布することになっています。)__FILE__
$_SERVER['DOCUMENT_ROOT']
私の最後の解決策は$_SERVER["REQUEST_URI"]
、ファイル部分を削除し、このディレクトリにget_headers()
既知のファイル ( dummy.php
) があるかどうかを確認するために使用することでした。そうでない場合は、親ディレクトリなどを確認します。残念ながら、get_headers()
私たちの学校のサーバーでは何も返されません (ただし、自宅のテスト システムでは動作します)。
機能する (ただし、あまり好きではない) 解決策の 1 つは、構成ファイルにプロジェクトのルート URL を含めることです。
誰かがそれについて別のアイデアを持っていますか? 前もって感謝します!
編集:
OK、自分に合った解決策を見つけました。私はまだコメントを受け付けていdebug_backtrace()
ます。この機能を使用しない理由はありますか?
function urlPath()
{
$trace = debug_backtrace();
$first_frame = $trace[count($trace)-1];
// the lowest frame gives us the filename from which the first call was made
$callerdir = dirname($first_frame['file']);
$includedir = dirname(__FILE__);
$rootLength = strlen($includedir);
$subDir = substr($callerdir, $rootLength);
$subdirDepth = substr_count($subDir,DIRECTORY_SEPARATOR);
// I use the fact that the include file is in the project root folder, so its
// folder path must be a prefix of any other file's folder path. I remove this
// prefix and count the number of path separators to get the "relative depth".
$pageURL = 'http';
if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on")
{
$pageURL .= "s";
}
$pageURL .= "://" . $_SERVER["SERVER_NAME"];
if (isset($_SERVER["SERVER_PORT"]) && $_SERVER["SERVER_PORT"] != "80")
{
$pageURL .= ":".$_SERVER["SERVER_PORT"];
}
$pageURL .= $_SERVER["REQUEST_URI"];
// I get the absolute URL of the calling page
for ($i = 0; $i <= $subdirDepth; $i++)
{
$idx = strrpos($pageURL,'/');
$pageURL = substr($pageURL, 0, $idx);
}
// I remove the required number of subdirectories plus one for the filename
return $pageURL;
}