-2

要求、ヘッダー リダイレクト、画像などのパスを作成するために使用できる Web ルート ディレクトリを定義する定数を作成しようとしています。

ルート フォルダーとサブ フォルダー内のファイルで使用する場合、定数が機能する必要があります。etcを使用してパスを簡単にハードコーディングできることはわかっています../が、これを機能させようとしている主な理由は (クリーンなコードは別として)、さまざまなサーバー上のさまざまなサイトでコードを再利用できるようにするためです。異なる場合があります。

私のディレクトリ構造

/
  index.php
    /library
      libSetPathRoot.php

ドキュメントルート

echo $_SERVER["DOCUMENT_ROOT"];
戻り値: /home/james/web/sites/
「sites」ディレクトリには、/etc/apache2/sites-available で定義されたさまざまなドキュメント ルートが含まれています (さまざまなスクリプトで作業できるようにするため)。

ファイルの内容

/index.php
require_once('library/libSetPathRoot.php'); //works fine.. of course

/library/libSetPathRoot.php
define("PATHROOT", realpath(__DIR__ .'/..').'/');

上記は私のルートを正しく返します:
echo PATHROOT;// /home/james/web/sites/site3/

ルートパスを定義するために、次のコードやその他のさまざまなコードを試しました。
これらおよびその他は、redirect()、include() では機能せず、まったく機能しませんでした。
define ('PATHROOT', getenv("DOCUMENT_ROOT"));
define ('PATHROOT', basename(dirname((__DIR__))));
echo PATHROOT;
それ以外はすべて「site3」のみを返すようでした。

作業定義は、ディレクトリ構造内のどこに配置されているかに関係なくinclude()機能します。require()つまり、ルートへのサブディレクトリ内のファイル内のルートまたはルートへの他のサブディレクトリを呼び出す場合、ルート内のファイル内のファイルに含まれるファイルなど。

しかし、これをheader()リダイレクトで機能させることはできません。繰り返しますが、使用する場所に関係なく、ルート スクリプト、サブ フォルダー スクリプト、インクルード スクリプトなどです。別のアプローチが必要かもしれませんが、多数のオプションを読み、それらを広範囲に試しました (半日を費やしました)。

私の定義がインクルードでは機能するのに、ヘッダー リダイレクトでは機能しないのはなぜですか? また、すべてで機能させるにはどうすればよいですか? それとも、インクルード用とリダイレクト用の 2 つの方法を使用する必要がありますか?


試したヘッダーリダイレクトの例の編集
header('Location: '.PATHROOT.'page-not-found.php');
: 404 を返します: /home/james/web/sites/site3/page-not-found.php
(ファイルは存在します)

4

2 に答える 2

2

header() でそのようなファイルのリダイレクトを行うことはできません。ブラウザが受け入れられる形式である HTTP ヘッダーをブラウザに送信します。ただし、ローカル(サーバー)ファイルパスを送信しています。これは明らかに機能していません。リダイレクト用の URL を送信する必要があります。header("Location: http://example.com/page-not-found.php")

PHP ドキュメントhttp://php.net/manual/en/function.header.phpを参照してください。

于 2013-09-12T03:56:27.157 に答える
2

header() 関数を使用して新しい HTTP ヘッダーを送信できますが、これは HTML またはテキストの前に (たとえば、宣言の前に) ブラウザーに送信する必要があります。

header('Location: http://www.example.com/');

URL は絶対URL である必要があります。RFC 2616を参照してください。ただし、ほとんどの場合、相対 URL も受け入れられます。

ただし、ヘッダー関数とインクルード関数では、まったく異なるパラメーターが必要です。ヘッダー関数は URL を想定し、インクルード関数はファイル システム ファイル オブジェクトを想定しています。

最終的には、"../../newHeader.php" のような相対 FS パス定義を使用してヘッダー関数を調整できます。

于 2013-09-12T03:53:50.323 に答える