1

http://www.site.com/resources/ディレクトリにリソースを配置するWebアプリを設計しています

私のHTMLでは、絶対パス/ resources /でそのディレクトリを参照しますが、問題は、Webサーバーでそれをテストすると、パスがhttp:// localhost / webapp / resources/になり、絶対パスは//localhost/resources/を検索します

./を使用してWebアプリケーションの相対ルートディレクトリを参照できることがわかりました。これで機能します。しかし、私はそれがどのように見えるかが好きではありません。

他にどのような選択肢がありますか?

  • 絶対パスを使用して、アプリケーションをサーバーのROOTディレクトリに配置します
  • 現在のルートディレクトリを決定するPHP/JSP変数を使用する
  • 引き続き使用します。/
  • 別のもの...

前もって感謝します!

4

1 に答える 1

4

問題を言い換えると、2 つの異なる構成で動作する必要があるサイトがあります。

  • http://servername/mypage.htm、 と
  • http://servername/SubSite/mypage.htm

2 番目の構成は、テスト サイトを表す場合があります (開発者のマシンの localhost である可能性もあります)。

画像、リンク、スタイルシートのすべてのパスは、どちらの展開でも相対アドレス指定を使用して機能する必要があります。

したがって、画像の src="/resources/mypic.jpg" を設定すると、サブサイトの例 (IIS では仮想ディレクトリまたはアプリケーションと呼ばれる) でのテストに失敗しますhttp://servername/resourceshttp://servername/SubSite/resources仕事。


私の開発チームに対するスタンスは、常にドキュメント相対パスを使用することです。

したがって、Web サイト ツリーのルートにある mypage.htm の基本的な例では (ファイル システムまたは Web サーバー上のどこにあるかに関係なく)、画像の src="./resources/mypic.jpg" を設定します。

基本的に、html で "./" が表示されている場合は、このページからという意味です。ディレクトリに移動する必要がある場合 (たとえば、~/Reports/myreport.htm の下にその画像を表示する必要がある別のページがあるとします)、そのページの画像タグのソースを src="../resources として設定します。 /mypic.jpg" は、1 レベル上に移動することを意味します。

注意してください、私はそこで卑劣なことをしました。ASP.NET では、~/ は Web サイトの場所に関係なく、Web サイトのルートを意味します。サイトのルートを反映するための略記として使用しています。ただし、ASP.NET では、サーバー側のコントロールは実際には URL の前に ~/ を付けて使用でき、適切なパスに正しく解決されます。

この問題の他の部分を調査しながら、今日学んだばかりの別の重要なポイントを追加します。CSS ファイルで、ドキュメント相対パスを使用して画像などを指す場合、そのパスは CSS ファイルに相対します。これは良いことです。なぜなら、CSS ファイルは画像ファイルに対して位置が変わることはめったにないからです。ただし、CSS ファイルが移動するのはどのような呼び出しなのでしょうか。次のポイントに進みます。


これまで説明してきたことは、基本的な Web ページでうまく機能し、移植性が非常に高くなります。CSS、画像などへの HTML 参照を生成するコードまたはコントロールを参照する複数のページが異なるディレクトリにある場合は、それらのパスも修正する必要があります。

基本的に、目的のリソースに到達するために必要な適切な ./ または ../ を持つように、これらの URL (通常は作成したコードまたはコントロール内) を変更する必要があります。

ASP では、VBscript を使用して Server.MapPath("/resources/mypic.jpg") を使用し、サイトのルートに対して必要な適切な URL を取得できます。

ASP.NET では、Page.MapPath("~/resources/mypic.jpg") を使用して、必要な適切な URL を取得できます。

また、次のように、.NET で必要な正しい ./ または ../ スラッシュを生成する関数も作成しました。

public static string GetDotDotSlashesToRoot(string Path, bool IncludeTrailingSlash) {
        System.Text.StringBuilder result = new System.Text.StringBuilder();
        Path = Path.Replace("\\", "/");
        Path = Path.Replace("~", string.Empty);
        if (Path.Length > 0 && Path[0] == '/') Path = Path.Substring(1);
        string slashless = Path.Replace("/", "");
        for (int i = 0; i < Path.Length - slashless.Length; i++) {
            result.Append("../");
        }

        if (!IncludeTrailingSlash && result.Length > 0) result = result.Remove(result.Length - 1, 1);

        return result.ToString();
    }

必要に応じて、 converter.telerik.comから実行してVB.net に変換できます。その関数を使用して javascript グローバル変数 JSPATHTOSITEROOT を公開するようにマスター ページを設定し、JS を介して必要なパスにプレフィックスを付けることもできます。

PHPについては、しばらく触れていなかったので、これを同様に解決するために公開した他のコードへのポインタをいくつか示すことができます: http://us2.php.net/manual/en/function.dirname .php#91208

このリンクは、C/C++ にネストを含めるように PHP にネストを含める方法を示していますが、同じトリックを使用して html のパスを修正することもできます。

私の結論としては、「/」で始まる画像と css のパスを含むプロジェクトを誰かがあなたに渡した場合、それらはテストに失敗するということです。コードは移植できません。21 世紀の優れた Web 開発者は、さまざまな理由と適切なコードにより、サイトがサーバー ルートまたはサブサイトとして展開される可能性があることを認識しています。

于 2012-06-20T22:06:59.587 に答える