9

(予備的な注意:この質問にはすでに多くのバリエーションがあるようですが、それらはすべて、私が求めているWeb URLの場所ではなく、物理的なPHPファイル自体のファイルシステムの場所に焦点を当てているようです。)


はじめに 1:

次の物理ファイルシステム構造を持つ小さな「Web サイト」があります。

variable.php
folder
  test.php

(つまり、variable.php最上位、およびtest.phpフォルダー内folder。)

ファイルの内容は次のとおりです。

<?php
//variable.php
$basePath = dirname($_SERVER['SCRIPT_NAME']);
?>

<?php
//test.php
include("../variables.php");
echo $basePath;
?>

イントロ 2:

この「ウェブサイト」をローカルで開発する場合は、次のアドレスにあります。

http://localhost/~noob/test-website

質問:

問題はhttp://localhost/~noob/test-website/folder/test.php、ブラウザに入力すると、 が出力されること/~noob/test-website/folder/です。

印刷したい/~noob/test-website(variable.phpの「Webロケーション」)。言い換えれば、ファイルシステム階層のより深いものであっても、すべてのファイルからグローバルにアクセスしたいと考えています/~noob/test-website。どうすればこれを達成できますか?

私は明らかに、このパスをハードコーディングしたくありません。その理由は、本番サーバーにアップロードすると、場所がより適切なものに変更されるためですhttp://example.com/(そして、このハードコードされたパスを、サーバー、したがってもちろんこの質問)。

4

10 に答える 10

4

ここでの問題は、Web サーバー (および PHP) が、テスト用のルート ディレクトリがサブディレクトリから提供されていることを認識しておらず、実際にはどちらも気にしていないことです。

明らかな解決策は、ハードコーディングされた相対ルートを持つ構成スクリプトを各サーバーに提供することです。あなたがすでに述べたように、あなたはこれをしたくありません。(実際には、サーバー固有の構成ファイルを提供することは悪いことではありません。多くの人は、はるかにばかげたことをしています)

この事実を回避するために、ソリューションは、特定の要求に対して使用できる参照ポイントに依存する必要があります。それらの参照ポイントは次のとおりです。

  • のファイルシステムの場所variables.php
  • 要求されているスクリプトのファイルシステムの場所。
  • ページが提供されるルートであるファイルシステムの場所

(ファイルシステムではなく強調したことは知っています-読み続けてください。これらを使用して値を取得します)

これらの値では、ディレクトリ構造に重複があります。これがあなたが求めている価値です。

例:

  • テスト サイトは次のとおりです。http://localhost/c/
  • リクエスト:http://localhost/c/d/myscript.php
  • variables.php は次の場所にあります。/a/b/c/variables.php
  • myscript.php は次の場所にあります: /c/d/myscript.php includes ../variables.php

ご覧のとおり、パスは/c/ディレクトリによって重複しています。

variables.php次のコードを使用して、そのオーバーラップを計算できます。

$fsRoot = __DIR__; // dirname(__FILE__) for PHP < 5.3 (and shame on you!)
$webRoot = str_replace($_SERVER['PHP_SELF'], '', $_SERVER['SCRIPT_FILENAME']);
$urlRoot = str_replace($webRoot, '', $fsRoot);

DOCUMENT_ROOT非常に簡単に間違っている可能性があるため、自分で計算しています(変数$webRoot)。

これは、サイトのルートにあるファイル システム ディレクトリを取得し、ページが提供されるベースであるファイルシステムディレクトリを削除します。残っているのは、実際の Web ルートとサブディレクトリの Web ルートの間にあったすべてのものです。variables.php

ではmyscript.php、次のことができます。

print $urlRoot . '/filename.js';

この例の出力は次のようになります。/c/filename.js

于 2012-10-18T14:24:53.510 に答える
3

うまくいけば、これに近づくでしょう(これはすべてvariables.phpにあるはずです):

// folder containing the requested script
$requested = dirname($_SERVER['SCRIPT_FILENAME']);

// folder containing variables.php
$current = dirname(__FILE__);

// relative path from variables.php to the requested script
$relative = str_replace($current, '', $requested);

// remove relative path from end of script name
$pattern = '#' . preg_quote($relative) . '$#';
$basePath = preg_replace($pattern, '', dirname($_SERVER['SCRIPT_NAME']));

:これはあなたの特定の例でうまくいくように見えますが、これは変数.phpが常にDOCUMENT_ROOTまたはその親のフォルダーにある必要があることを意味します。そうしないと、上記を使用して相対パスを決定できません。

于 2012-10-14T23:09:03.123 に答える
1

完全に確実なわけではありませんが、Kurogoが使用するソリューションはほとんどの場合機能します。

https://github.com/modolabs/Kurogo-Mobile-Web/blob/release-1.5/lib/Kurogo.php#L797

基本的にとを比較しREQUEST_URI、一致するまでDOCUMENT_ROOTフォルダをからに追加し続けます。からビルドしてWEBROOT_DIR(この場合はvariables.phpからのものである可能性があります)が 見つかると、既存のパスを$urlBaseとして保存します。REQUEST_URIDOCUMENT_ROOTdirname(__FILE__)DOCUMENT_ROOT

これはサブフォルダ/シンボリックリンクに対してのみ機能し、apacheエイリアシングなどを処理しないため、特にあなたのケースでは機能しない可能性がありますが、少なくとも答えの一部です。

于 2012-10-23T16:18:01.583 に答える
1

それがあなたの問題を永遠に解決するかどうかはわかりませんが、あなたの例ではうまくいきます:

$x = explode("/", $_SERVER['SCRIPT_NAME']);
echo $_SERVER['SERVER_NAME'] . '/' . $x[1] . '/';

出力が気に入った場合は、ニーズに合わせてカスタマイズできます。:)

于 2012-10-15T11:22:09.910 に答える
0

たくさんの画像があり、中にフォルダがあるディレクトリを読み取る必要があり、すべてのファイルを再帰的に読み取る必要があるプロジェクトで働いていました...

働き:

function ListIn($dir, $prefix = '') {
  $dir = rtrim($dir, '\\/');
  $result = array();

    foreach (scandir($dir) as $f) {

        if ($f !== '.' and $f !== '..') {

            if (is_dir("$dir/$f")) {
              $result = array_merge($result, ListIn("$dir/$f", "$prefix$f/"));
            } 
            else {
                $ext = substr($prefix.$f, strrpos($prefix.$f, '.') + 1);

                if(in_array($ext, array("jpg"))){
                    // echo $prefix.$f."<br>";
                    $result[] = $prefix.$f;
                }


            }

        }

    }

  return $result;
}

使用方法:

$path='images/mytest';

$images = (ListIn($path));

foreach($images as $image){
        $image=explode("/",$image);
        echo $image=$image[2];
}

ご覧のとおり、すべての画像が配列になり、必要なディレクトリを抽出するために、その配列の最初の要素にアクセスできます...この場合、画像は配列の2番目のインデックスにあります。ファイル構造の深さについて...

これがお役に立てば幸いです。

于 2012-10-22T16:15:38.557 に答える
0

特定のフォルダーと Web 構造に関する知識に基づいて正しい答えを推定することはできますが、それは一般的な解決策とはほど遠いものです。ただし、各「ページ」のエントリ ポイントであるブーストラップ ファイルを使用することをお勧めします。$basePathそこで、変数やその他の必要な値を設定できます。

もう 1 つの方法は、Apache から配列へのベース パスを挿入することです$_SERVER(使用している場合は、アプリケーション全体で使用できるようになります)。

これを達成する方法については、こちらを参照してください

または、特定のサーバーのベース パスを含む構成ファイルを用意します。

于 2012-10-25T09:23:55.890 に答える
0

明らかに、このパスをハードコーディングしたくありません。その理由は、実稼働サーバーにアップロードすると、場所がhttp://example.com/のようなより適切なものに変更されるためです(そして、その必要はありません) 。サーバーにアップロードした後、このハードコードされたパスを変更します。したがって、もちろんこの質問です)。

パスをハードコードすることもできますが、ホームページからの相対パスにするだけです。

たとえば、http://localhost/~noob/test-website/http://example.comは同じものです。その下のことだけを心配してください。

于 2012-10-24T15:42:13.677 に答える
0

(予備的な注意:この質問にはすでに多くのバリエーションがあるようですが、それらはすべて、私が求めているWeb URLの場所ではなく、物理的なPHPファイル自体のファイルシステムの場所に焦点を当てているようです。)

[HR][/HR]イントロ 1:

次の物理ファイルシステム構造を持つ小さな「Web サイト」があります。

variable.phpfolder test.php (つまり、最上位に variable.php、フォルダー フォルダーに test.php があります。) ファイルの内容は次のとおりです。

[HR][/HR]イントロ 2:

この「ウェブサイト」をローカルで開発する場合は、次のアドレスにあります。

http://localhost/~noob/test-website[HR][/HR]質問:

問題は、私が入れた場合

localhost/~noob/test-website/folder/test.php をブラウザに入力すると、/~noob/test-website/folder/ が出力されます。

/~noob/test-website (variable.php の「Web の場所」) を出力したい。言い換えれば、すべてのファイルから、ファイル システム階層のより深いファイルも含めて、/~noob/test-website にグローバル アクセスできるようにしたいと考えています。どうすればこれを達成できますか?

明らかに、このパスをハードコーディングしたくありません。その理由は、実稼働サーバーにアップロードすると、場所がhttp://example.com/のようなより適切なものに変更されるためです(そして、その必要はありません) 。サーバーにアップロードした後、このハードコードされたパスを変更します。したがって、もちろんこの質問です)。

于 2012-10-25T05:15:22.263 に答える
-1

この機能を使用してください:-

#This function will return the current script name
function get_script_name()
{
    $uri_array = explode('/',$_SERVER['SCRIPT_NAME']);
    $script_name = end($uri_array);
     return $script_name;
}
#call The function
$script_name = get_script_name();
echo $script_name;
于 2012-10-23T11:19:16.487 に答える
-1

docroot (外部フォーム) を検索していると思います - (ファイルシステム内) で見つけることができます& (または以前の PHP の場合$_SERVER['DOCUMENT_ROOT']) と比較します__DIR__dirname(__FILE__)

于 2012-10-21T10:24:18.480 に答える