Относительно включает в себя больше не работает после перехода на IIS? - PullRequest
2 голосов
/ 01 декабря 2009

Хорошо, я видел много жалоб о директиве php include () здесь. Похоже, это стало причиной скорби и для меня.

Моя структура сайта выглядит примерно так:

public_html\index.php
public_html\includes\content.inc.php
public_html\language\en\language.inc.php
public_html\classes\db.inc.php

Сайт работает на Apache без проблем. Однако он не работает на IIS (grr ... # @ !!!%).

Позвольте мне объяснить: Что делается, так это то, что index.php всегда вызывается веб-браузером и, в зависимости от запроса, включает в себя content.inc.php (существует много таких файлов содержимого и индекса. php включает в себя соответствующий, основанный на логике)

// -- index.php --
include(includes/content.inc.php);

Пока что он хорошо работает как на Apache, так и на IIS.

Теперь content.inc.php в свою очередь включает в себя lang.inc.php и db.inc.php .

Похоже:

// -- content.inc.php --
include(language/en/language.inc.php)
include(classes/db.inc.php)

Эти строки хорошо работают на Apache, но IIS жалуется, что не может подать файлы для включения.

Почему? Потому что Apache поддерживает текущую папку "." public_html\, где выполнение скрипта началось впервые. IIS, с другой стороны, меняет значение «.» быть файлом, который в настоящее время обрабатывается. т.е. после включения content.inc.php IIS интерпретирует «.» как public_html\includes\

Теперь я знаю, что одно решение состоит в том, чтобы каким-то образом изменить все включаемые пути на абсолютные. Но мой вопрос, действительно ли это проблема Apache / IIS, насколько я понимаю? Есть ли настройка IIS или PHP, чтобы заставить его вести себя корректно, не разбираясь в коде?

Кстати, PHP.ini имеет

include_path=".;C:\PHP\PEAR"

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Ваши включаемые файлы должны быть вне вашего дерева public_html полностью.

// Your setup should resemble:

/public_html/index.php
/includes/
/include/languages
/include/classes

// If on your phsical drives, they equate to;

c:/wwwroot/public_html/index.php
c:/wwwroot/includes/
c:/wwwroot/includes/languages
c:/wwwroot/includes/classes

Затем настройку в вашем файле PHP.INI следует изменить на:

include_path = ".; C \ PHP \ PEAR; C: \ wwwroot \ includes"

Если я предполагаю, что что-то вроде wwwroot - это каталог, в который вы поместили свой html, при необходимости измените его.

Перезапустите службу IIS, чтобы выбрать новую настройку ini.

echo ini_get('include_path') ; 

чтобы сохранить ваше здравомыслие ...

Теперь PHP всегда будет заглядывать внутрь wwwroot / include для ваших включаемых файлов, поэтому вы можете включить такие вещи, как / languages, делая это;

include 'language/eng/language.inc.php' ;

Что ты и хочешь.

0 голосов
/ 10 декабря 2009

Я обычно хотел бы включить из корня сервера, например include '/includes/language.inc.php'. Таким образом, он будет работать из любой папки в структуре вашего сайта. Я также связываю все свои CSS и JavaScript, просто упрощая вставку файлов включаемых файлов, когда у вас есть файлы из разных структур папок, которые их называют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...