10

TL;DRinclude : PHP のコマンドに含まれるページで相対リンクを使用しようとする場合、このページの最後のコード サンプルに代わるものは何ですか?


include()ドキュメントにリンクするファイルを作成しようとしていますが.css、問題は、複数の (異なる) ディレクトリからこのファイルを含める必要があることです。私のディレクトリ構造は次のようになります。

www
├── (getpath.php)
│
├── css
│   └── style.css
├── php
│   └── header.php
└── content
    ├── index.php
    └── posts
        └── index.php

(私はheader.php両方のindex.phpファイルに含めています。header.phpは参照するファイルですstyle.css(ブラウザが見つけられる必要があります)。例: を使用する../css/style.cssと、CSS は my に表示されますcontent/index.phpが、 my には表示されませんcontent/posts/index.php。ブラウザが探しているためです) content/css/index.php.)

Web サイトは、ドキュメント ルート自体ではなく、ドキュメント ルートのサブディレクトリに配置された場合にも機能するはずです。このため、/css/style.css(サーバー ルートに対して) を使用して CSS スタイルシートにリンクすることはできません。

CSS ドキュメントの場所をブラウザに伝える最も簡単な方法は、おそらくドキュメント ルートからの相対パスを指定することだと思います(間違っていたら訂正してください!) 。私の Web サイトはドキュメント ルートのサブディレクトリconfigにあると予想されるため (そして、ファイルを使用してサブディレクトリを保存することは避けたい)、Web サイトがあるサブディレクトリの相対パスを見つける必要があります。getpath.php私のウェブサイトのルート ディレクトリ (ドキュメント ルートではない) で呼び出されるファイル。そのファイルには、次のように書きました。

<?php
  define('PROJECT_SUBDIRECTORY', $_SERVER['PHP_SELF']);
?>

content/index.phpただし、これにより、インクルード ファイル ( ) ではなく、ユーザーがブラウザーで要求した PHP ファイル (例 ) の相対ディレクトリが得られることに気付きましたgetpath.phpPHP_SELFに基づいていることも読んだことがありますREQUEST_URIが、これは安全ではありません。私はここでこの解決策を見つけました:

define('PROJECT_DIR', preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', __DIR__));

それは完全にうまく機能しますが、これを行うための「より良い」方法があるかどうか疑問に思っています。そのための変数を見つけることができませんでした — 上記の解決策が本当にそれを行う唯一の方法ですか?

前のコード例を使用する必要がありますか、それともより良い方法がありますか?
ディレクトリ構造を変更する必要がありますか? 他の人はこの問題をどのように解決しますか?


編集: Web サーバーに複数の (完全に独立した) Web サイトがあり、それらはすべてドキュメント ルートのサブディレクトリ (、、... など/documentroot/project1/)/documentroot/project2/
あり、Web サイトをサブディレクトリで動作させようとしています。もちろん、CSS を 経由/css/style.cssでブラウザーに送信することもできますが、Web サイトがサブディレクトリにある場合は機能しません。また、構成ファイルを使用して、ドキュメント ルートに対するプロジェクトの相対パスを指定することも避けたいと考えています。


別の編集:問題は、私のプロジェクトのすべてのphpファイルに、/documentroot/project1PHPのinclude機能を使用してナビゲーションバーが含まれていることです。ナビゲーション バーは として保存され、ナビゲーション バー/documentroot/project1/php/header.phpの css はとして保存され/documentroot/project1/css/style.cssます。相対リンクを使用する場合 (ブラウザーに場所を伝えるためstyle.css)、ブラウザーはパスがindex.phpではなく相対パスheader.phpであると認識し、 と同じディレクトリで CSS を検索しますindex.php
問題: 異なるディレクトリに複数の index.php ファイルがあり、index.phpファイルを含むすべてのディレクトリに CSS フォルダーをコピー & ペーストしたくありません。

4

4 に答える 4

0

相対 URL、またはスクリプトがドキュメント ルートからの相対位置にある場所

preg_replace('/[\\\\\\/]+/', '/', '/' . substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT'])) . '/' )
于 2015-09-19T07:28:41.687 に答える