3つ以上のディレクトリに戻るファイルをどのように含めますか。 ../index.php
を使用して2ディレクトリ前のファイルをインクルードできることを知っていますが、3ディレクトリ前のファイルをどのように戻しますか?これは理にかなっていますか? .../index.php
を試しましたが、機能しません。
/game/forum/files/index.php
にファイルがあり、PHP includeを使用してファイルをインクルードします。 /includes/boot.inc.php
;にあります/
はルートディレクトリです。
..
は、現在から親ディレクトリを選択します。もちろん、これは連鎖させることができます:
../../index.php
これは、2つ上のディレクトリになります。
ファイルを1つのディレクトリに戻すには、'../file'
を使用します。 2つのディレクトリに戻るには、'../../file'
を使用します。等々。
ただし、現実的には、現在のディレクトリに関連するインクルードを実行しないでください。そのファイルを移動したい場合はどうしますか?すべてのリンクが壊れます。ファイルを移動してもリンクを保持したまま、他のファイルにリンクできるようにする方法は次のとおりです。
require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');
DOCUMENT_ROOT
は、コードが配置されているベースディレクトリを表すサーバー変数です。
. = current directory
.. = parent directory
だから../
はあなたを2つではなく1つのディレクトリに戻します。
チェーン../
を2レベル以上上げるのに必要な回数だけ。
include dirname(__FILE__).'/../../index.php';
ここが最善の策であり、他のソリューションで発生する可能性がある相対パスのバグのほとんどを回避できます。
実際、インクルードは常に現在のスクリプトの位置に対してこのコードが配置される場所に強制されます(アプリケーションのアーキテクチャを定義するため、この場所はおそらく安定しています)。これは、単にinclude '../../index.php'
実行中(「呼び出し」とも呼ばれます)スクリプトに相対的に、そして現在の作業ディレクトリに相対的に を行うこととは異なります。これは、親スクリプトを指します。含まれているスクリプトのパスから解決する代わりに、スクリプトが含まれています。
PHPドキュメントから:
ファイルは、指定されたファイルパスに基づいてインクルードされます。指定されていない場合は、include_pathが指定されます。ファイルがinclude_pathで見つからない場合、includeは失敗する前に呼び出しスクリプトの自身のディレクトリと現在の作業ディレクトリを最終的にチェックインします。
そして、私がこのトリックを引用して見つけた最も古い投稿 2003年に遡る、Tapkenによる 。
次のセットアップでテストできます。
次のようなレイアウトを作成します。
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
parent.php
に次を入力します。
<?php
include dirname(__FILE__).'/sub/included.php';
?>
sub/included.php
に次を入力します。
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
parent.php
にアクセスしたときの結果:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
ご覧のとおり、最初のケースでは、パスは呼び出しスクリプトparent.php
から解決されますが、dirname(__FILE__).'/path'
トリックを使用することで、スクリプトincluded.php
からインクルードが行われます。に配置されます。
他の場所で読むことができるものに反して、上記のトリックと同等ではない以下に注意してください:
include '/../../index.php';
実際、/
を先頭に追加しても機能しますが、呼び出しスクリプトのinclude ../../index.php
と同様に解決します(違いは、include_path
が失敗した場合、後で検索されないことです)。 PHP docから :
パスが定義されている場合-絶対(Windowsではドライブ文字または\、またはUnix/Linuxシステムでは/で始まる)または現在のディレクトリからの相対(。または..で始まる)である場合-include_pathは完全に無視されます。
../
は1つのディレクトリです。2つのディレクトリ../../
または3つのディレクトリ(../../../
など)に対して繰り返します。
定数を定義すると、ディレクトリを逆方向にドリルダウンするため、混乱を減らすことができます。
次のような定数を定義できます。
define('BD', '/home/user/public_html/example/');
define('HTMLBD', 'http://example.com/');
「BD」または「ベースディレクトリ」を使用する場合、次のようになります。
file(BD.'location/of/file.php');
../../index.php
../../../includes/boot.inc.php
../
の各インスタンスは、1つのディレクトリのアップ/バックを意味します。
以下は、さまざまなディレクトリにアクセスする方法です。
./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
../../directory/file.txt
を実行できます-これは2つのディレクトリに戻ります。
../../../
-これは3つあります。等
../../../index.php
../../../includes/boot.inc.php
ただし、VERYに注意して、ユーザーにファイルを選択させるようにしてください。たとえば、次のようなファイルを取得することを許可したくありません。
../../../../../../../../../../etc/passwd
または他の機密システムファイル。
(申し訳ありませんが、私はLinuxのシステム管理者だったのでしばらくしており、私はthinkこれは私が覚えているものから、機密ファイルです)
__DIR__
を使用して 現在のphpファイルディレクトリ を指定することをお勧めします。理由について here を確認してください。
__DIR__ . /../../index.php
php7を使用している場合、たとえば、levelパラメーターが2のdirname関数を使用できます。
dirname("/usr/local/lib", 2);
2番目のパラメーター「2」は、レベルアップの数を示します
インクルードの開始時に/
をインクルードすると、インクルードはサイトのルートからのパスとして取得されます。
サイトが http://www.example.com/game/forum/files/index.php の場合、インクルードを/includes/boot.inc.phpに追加して解決できます- http://www.example.com/includes/boot.inc.php .
一部のWebサーバーでは無効になっているため、..
トラバーサルに注意する必要があります。また、サイトを新しいマシン/ホストに移動するときに問題が発生し、構造が少し異なります。
../../
を試してください。 2つのディレクトリに戻るため、それに応じて変更できます。最初にルートディレクトリにアクセスしてから、必要なディレクトリにアクセスします。
例えば。 root/inc/usr/ap
にいて、別のディレクトリroot/2nd/path
があります。次のようにpath
からap
ディレクトリにアクセスできます:../../2nd/path
最初に目的のディレクトリよりもルートに移動します。動作しない場合は共有してください。
オーバーディレクトリを含むプロキシファイルによって処理することができます
..... | _proxy.php
dbsettings.php:
$Host='localhost';
$user='username':
$pass='pass';
proxy.php:
include_once 'db/dbsettings.php
requiredDbSettings.php:
include_once './../proxy.php';
あなたの答えを見て、構文にパスを含める
require_once '../file.php'; // server internal error 500
hTTPサーバー(Apache 2.4.3)が内部エラー500を返しました。
にパスを変更したとき
require_once '/../file.php'; // OK
すべて順調。
これを試してみてください
この例は1つ前のディレクトリです
require_once('../images/yourimg.png');
この例は2つ前のディレクトリです
require_once('../../images/yourimg.png');