web-dev-qa-db-ja.com

別のディレクトリからのphpインクルードファイル

構造の例を次に示します。

/main
 /css
  style.css
 /include
  article1.php
  article2.php
 header.php
 index.php

私のheader.phpには、css用の次のコードがあります。

<link rel="stylesheet" type="text/css" href="css/style.css" />

そして、例えば、私のindex.phpには、最初の行として次のものがあります。

<?php include 'header.php'; ?>

これで、すべてがそのまま正常に機能します。次に、article1.phpファイルに次のコードを挿入します。

<?php include '../header.php'; ?>

コンテンツ(メニューやその他のhtml)は正しく表示されますが、CSSはまったく表示/認識されません。基本的に何が起こっているのかというと、ヘッダーファイルはインクルードされていますが、サーバーはディレクトリの子育てを尊重していません。 CSSを正しく表示するには、CSSのlink rel../css/style.cssに変更する必要がありますが、そうすると、メインディレクトリにあるファイルでは機能しません。

問題を明確にしたいと思います。私は何が間違っているのですか?異なるディレクトリのファイルを含めて、その中のリンクを保持するにはどうすればよいですか?

6
coldpumpkin

サイトの<head>セクションに、 <base>要素href属性を挿入します。 href属性をWebサイトのベースURLに設定すると、すべてのrelativeリクエストがそのベースURLを介して送信されます。

<base href="http://my-website-url.com/" />
<link rel="stylesheet" type="text/css" href="css/style.css" />

正しく設定されたbaseタグを使用すると、ユーザーのブラウザはURL http://my-website-url.com/css/style.cssからスタイルシートを読み込もうとします。

注:これはスタイルシートだけでなく、ドキュメント内のすべての相対リンクにも影響します。

20
Matt

これは、インクルードでパスがどのように機能するかと関係があります。可能な限り、ドキュメントルートからパスすることをお勧めします。

<?php include( $_SERVER['DOCUMENT_ROOT'] . '/header.php' ); ?>

これはどのファイルでも機能します。

14
mikevoermans

相対パスを使用する代わりに:

href="css/style.css"

webrootからの絶対パスを使用します。

href="/css/style.css"
5
bubba

まず、問題は、CSSファイルへのリンクが間違っていることです。最善の方法は、ページからのHTML(ソースの表示)の出力を確認することです。それでは、それを分解しましょう(index.phpを形成します):

Index.phpdomain.tld/index.phpにあります。 cssファイルはdomain.tld/css/*にあります。インデックスファイルを表示すると、ヘッダーは

<link rel="stylesheet" type="text/css" href="css/style.css" />

これは、ディレクトリ(またはルート)の最上位にいて、リンクがこのディレクトリに関連して作成されているために機能します。 domain.tld/include/article1.phpに移動すると、ルートにいなくなります。アクセスしようとしています:

domain.tld/include/css/style.css

これは、完全なリンクを構築するか、親戚を変更する必要があることを意味します。 CSSがルートにあるため、簡単な方法は次を使用することです。

<link rel="stylesheet" type="text/css" href="/css/style.css" />
                                             ^

これは、cssディレクトリのドメインのルートをdomain.tld/css/styles.cssとして検索することを意味します。トップディレクトリが/mainの場合は、/main/css/styles.cssを使用します

3
UnholyRanger

ルートからcssファイルを含める必要があります。したがって、/ css/style.cssは、常にルートから開始し、そこから下に移動するようにします。私はそれがすべての場合にあなたの問題を解決するはずだと信じています。

3
wallerjake

あなたの問題とその解決方法を説明してもいいですか。

Phpでのインクルードは、Cと同様に機能します。ページのコンテンツをコピーして最初のページに貼り付けるページをインクルードする場合。

したがって、2つのファイルがあります。

include.php

<?php
$var = 'PHP';
?>

main.php

<?php
include 'include.php';
echo $var; // affiche 'PHP'
?>

「main.php」ページをリクエストすると、次のようになります。

<?php
$var = 'PHP';
echo $var; // affiche 'PHP'
?>

したがって、ページに要素を含める必要がある場合。 2つの選択肢があります。

1。絶対パス(より良い方法)

相対パスを使用する代わりに、絶対パスを使用します。このようにして、現在のパスを使用せずに、どこからでもファイルを含めることができます。

2。変数

リポジトリ/ウェブサイトのルートディレクトリへの相対パスを含む変数を使用できます。したがって、ページを含めるか作成する必要があるたびに、次のように変数を定義する必要があります。

include.php

<?php
$var = 'PHP';
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"".$currentPath."css/style.css\" />";
?>

main.php

<?php
# path to the root of the website
$currentPath = "../";

include 'include.php';
echo $var; // affiche 'PHP'
?>

インクルードの詳細については、 このページを参照

2
Xavier S.

2つのオプションがあります

  1. インクルードされたファイルへの相対パスを渡します

すなわち。

<link rel="stylesheet" type="text/css" href="<?=$path ?>css/style.css" />

そして

$path = "../";
include "header.php";

または2.ファイルへの絶対パスを使用する

<link rel="stylesheet" type="text/css" href="/css/style.css" />
1
Philipp

インクルードとしてすでに呼び出されているファイルからの相対インクルードを使用することは常に問題です。相対的な場所を指定するたびに、

_../some_directory/some_file.php
_

_dirname(dirname(__FILE__)) . '/some_directory/some_file.php'
_

dirname(__FILE__)は現在のディレクトリです。

1
SteeveDroz