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 отображался правильно, мне пришлось бы изменить link rel
для CSS на ../css/style.css
, но если я это сделаю, это не будет работать с файлами, расположенными в главном каталоге.
Надеюсь, я ясно изложил свою проблему. Что я делаю не так? Как я могу включить файлы из разных каталогов и сохранить ссылки внутри них?
8 answers
В разделе <head>
вашего сайта вставьте элемент <base>
с атрибутом href
. Установите атрибут href
в базовый URL вашего веб-сайта, и все относительные запросы будут отправляться через этот базовый 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
.
Примечание: это влияет не только на таблицы стилей, но и на все относительные ссылки в документе.
Это связано с тем, как работает паттинг в includes. Я рекомендую по возможности исправлять ошибки из корневого каталога doc.
<?php include( $_SERVER['DOCUMENT_ROOT'] . '/header.php' ); ?>
Это будет работать в любом из ваших файлов.
Вместо использования относительных путей:
href="css/style.css"
Используйте абсолютные пути из веб-корня:
href="/css/style.css"
Вы должны включить свой css-файл из корневого каталога. Так что /css/style.css таким образом, он всегда будет начинаться с корня, а затем спускаться оттуда. Я считаю, что это должно решить вашу проблему во всех случаях.
Во-первых, проблема в том, что ваша ссылка на ваши CSS-файлы неверна. Лучшее, что можно сделать, это посмотреть на вывод HTML (источник просмотра) со страницы. Итак, давайте разберем это (форма index.php ):
Index.php
находится по адресу domain.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
Могу ли я объяснить вашу проблему и как ее решить.
Включение в php работает так же, как и в C. Когда вы включаете страницу, которая копирует/вставляет содержимое страницы в первую.
Итак, есть два файла:
include.php
<?php
$var = 'PHP';
?>
main.php
<?php
include 'include.php';
echo $var; // affiche 'PHP'
?>
Когда вы запрашиваете"main.php "страница, на которой вы получите следующее:
<?php
$var = 'PHP';
echo $var; // affiche 'PHP'
?>
Поэтому, если вам нужно включить элемент на свою страницу. У вас есть два варианта:
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'
?>
Чтобы узнать больше о include, смотрите эту страницу
У вас есть два варианта
- Передайте относительный путь к включенному файлу
Т.е.
<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" />
Использование относительных включений из файла, уже вызванного как включенный, всегда является проблемой, каждый раз, когда вы указываете относительное местоположение, заменяйте свой
../some_directory/some_file.php
С
dirname(dirname(__FILE__)) . '/some_directory/some_file.php'
dirname(__FILE__)
является текущим каталогом.