PHP неработающие относительные ссылки во вложенных каталогах - PullRequest
0 голосов
/ 19 декабря 2011

Ладно, я рвал на себе волосы за то, что кажется эонами сейчас, и кажется, что каждый ответ (как на SO, так и за рубежом) либо не работает, либо вводит в заблуждение.Я относительно новичок в PHP, и я уверен, что мне не хватает некоторых простых объяснений, но я хочу подтвердить - поэтому предположим, что я знаю очень мало.

У меня есть структура каталогов, как это (на данный моментСущество) из:

Мой основной сайт (localhost / project / на моем тестовом сервере и C: / xampp / htdocs / project на моем жестком диске) с этими файлами и папками:

Root
  graphics
    variousgraphics.png

  support
    stylesheet.css


  templates
    header.php
    footer.php
    initialize.php

  you
    default.php

  index.php
  anotherfile.php

До тех пор, пока я не создал папку 'you', все было нормально, т.е. я включил файл инициализации для index.php как <?php include(templates/initialize.php) ?>

Но когда я решил включить initialize.php, используя вышеупомянутый метод по умолчаниюФайл .php (внутри 'you'), он ошибся с Warning: include(templates/initialize.php) [function.include]: failed to open stream: No such file or directory in C:\xampp\htdocs\photoquilt\you\default.php

Так что, естественно, я добавил ../, чтобы создать <?php include(../templates/initialize.php) ?>, но, конечно, это не сработало, потому что файлы, на которые есть ссылки внутри, инициализируются.php не были добавлены таким же образом, и поэтому я попал сюда.

Стоит отметить, что эхо $_SERVER['document_root'] приводит к C: / xampp / htdocs

Итак, в заключение ...

Есть ли способ убедиться, что все ссылки / пути работают?k правильно, независимо от того, откуда исходящий путь был ???

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Насколько я могу судить, здесь есть пара проблем: на стороне сервера и на стороне клиента.

Что касается PHP, у вас все хорошо. Ссылка на файл по его относительному пути (../templates/initialize.php) - это путь. Есть и другой способ добиться того же, но я бы не советовал: отредактируйте include_path, чтобы добавить корневой каталог вашего проекта. Вы можете сделать это в .htaccess, расположенном в корневом каталоге, то есть:

php_value include_path ".:/path/to/your/project:/usr/local/lib/php"

Для части HTML (изображения не загружаются, таблицы стилей не найдены) вы можете установить базовую ссылку:

<base href="http://path.to.your/in-server/" />

База href должна указывать на корень вашего каталога. Все изображения, таблицы стилей и т. Д. В HTML должны быть исправлены для использования относительных URI из корня проекта (graphics/variousgraphics.png).

1 голос
/ 19 декабря 2011

В default.php вы можете определить константу наподобие

define('ROOT_PATH', dirname(__DIR__));

или для версий php до 5.3.0

define('ROOT_PATH', dirname(dirname(__FILE__)));

, а затем используйте ROOT_PATH во всех сценариях для построения путей к файлам.

см
- http://docs.php.net/language.constants.predefined
- http://docs.php.net/dirname

...