0

現在、PHP アプリは Web サーバーのドキュメント ルートにセットアップする必要があります (通常は Apache の仮想ホストを構成することによって)。

この依存関係の主な理由は、URL 生成ロジックがすべての URL に絶対パスでアクセスできると想定しているためです/。これにより、画像やページなどのリソースへのリンクが簡単になります。

ユーザーは別のサブフォルダーからアプリにアクセスしている可能性があるため、単純な相対パスが機能するとは想定できません。

アプリを Web サーバーのドキュメント ルートで実行する必要がないようにするにはどうすればよいでしょうか。$_SERVER['DOCUMENT_ROOT']その URL コントローラーで解析して、ファイル システム内でファイルがアクセスされている範囲を判断することをお勧めしますか? 今のところ、その解析を確実に行う方法はわかりません。ここで複雑なのは、Apache の ReRewrite を使用しているため、URL がファイル システムと必ずしも一致しないことです。

4

2 に答える 2

1

私は通常、この目的のために次のような単純で愚かな方法を使用します。

ユーザーがアプリケーションのさまざまなエントリ ポイントから非決定論的にアクセスできる場合、エントリ ポイントは、アプリケーション ルートに対して相対的に「どこにいるのか」を認識している必要があります。

まず、現在のスクリプト wr アプリケーション ルートの相対位置を知る必要があるため、スクリプトに静的に書き込みます。にあるはずのスクリプトの場合

...approotdirname/appsubdir1name/appsubdir2name/here.php

.

$relPath = 'approotdirname/appsubdir1name/appsubdir2name';
  • スクリプトがアプリケーション ルートにある場合、以下で計算される $curPath は、サーバー上のアプリケーションの位置になります。

次に、Php から現在のスクリプト ファイル パスを統一形式で取得する必要があります。

$curPath = str_replace('\\','/',dirname(__FILE__));

(str_replace は、存在する場合に \ を / に置き換えるためのものです。) 実際には、$relPath のコピーが (正しく計算されていれば) $curPath の最後に存在するはずです。

次に、$curPath で $relPath の位置を見つけます。

$p = stripos($curPath, $relPath, 0);
if(($p === false)||($p < 0)){echo "Relative path: $relPath is invalid."; exit(0);}

ここで、$curPath から $relPath を差し引くと、サーバー上のアプリケーション ルートがどこにあるのかを少し確認することで取得できます。

$rootPath = ($p > 0)? substr($curPath, 0, $p-1): '/';

これが役立つことを願っています。

アプリケーション ルートの index.php のような単一のポイントを介してユーザー アクセスを制限することは、一般的により良い方法として受け入れられていることに注意してください。あなたが得ることができる入り口にあります

$rootPath = str_replace('\\','/',dirname(__FILE__)).'/';

ファイルアクセスとインクルードのために、アプリケーション全体で使用します。おまけとして、ファイルの関係を壊さずにアプリケーション全体を移動できます。

于 2013-02-21T09:04:18.897 に答える
0

2 つのオプションが表示されます。

  1. 既存のプログラムをリファクタリングして、単一のスクリプトを介してすべてのリクエストをルーティングします (上記で推奨されていますが、私たちのプロジェクトでは実用的ではありません)。

  2. smudge および clean 属性フィルターを使用します。比較的高度な git が必要です。

于 2013-02-24T06:12:28.143 に答える