Мод Rewrite Rule меняет CWD в PHP - почему? - PullRequest
0 голосов
/ 15 июля 2011

У меня странная проблема, для которой я не могу найти документацию. У меня есть страница в следующем месте на моем сервере.

{SITE_ROOT}/admin/myfolder/myfile.php

Этот файл использует include для запуска файла глобальной конфигурации, который находится в корне сервера - он делает это относительно себя

// {SITE_ROOT}/admin/myfolder/myfile.php
// includes {SITE_ROOT}/config.php    See below explanation after edit
include('../config.php);

Это прекрасно работает, пока я не добавлю следующий файл .htaccess в каталог myfolder

// {SITE_ROOT}/admin/myfolder/.htaccess
RewriteEngine On
RewriteRule ^([0-9A-Z]+)\.gif$ gif_generator.php?gifid=$1 [L]

Цель этого правила не важна - дело в том, что это правило не должно затрагивать приведенную выше страницу (myfile.php) (оно не должно соответствовать регулярному выражению, если я не ошибаюсь - и я мог бы хорошо быть). Тем не менее, кажется, что когда используется это правило, include () внутри myfile.php завершается ошибкой. Это похоже на то, что текущий рабочий каталог php-файла изменяется благодаря включенному RewriteEngine.

Это где-нибудь задокументировано и есть ли способ предотвратить это?

edit - Я пропустил что-то довольно важное. Исходный файл ({SITE_ROOT} /admin/myfolder/myfile.php) сам по себе включается файлом в следующем месте ({SITE_ROOT} /admin/frontcontroller.php). Путь включения в myfile.php фактически относится к этому файлу. Я изменил вышеуказанный вопрос, чтобы отразить это.

1 Ответ

0 голосов
/ 15 июля 2011

Может быть, это полезно для вас:

dirname(__FILE__)

возвращает каталог, в котором находится файл. Поэтому, если вы знаете структуру каталогов вашего сайта, вы можете использовать что-то вроде

dirname(dirname(__FILE__))

Вы также можете использовать

DIRECTORY_SEPARATOR

для получения разделителя каталогов, специфичного для ОС сервера

В вашем случае это станет

include(rtrim(dirname(dirname(__FILE__)),'/\\').DIRECTORY_SEPARATOR.'config.php')
...