Вот проблема, с которой я столкнулся в последнее время – неправильно сконфигурированный apache на веб-хосте. Это означает, что все скрипты, которые полагаются на $_SERVER['DOCUMENT_ROOT']
ломаются. Самое легкое обходное решение, которое я нашел, просто задает переменную в некоторых общедоступных общедоступных файлах, которые являются общими, но больно не забывать об этом. Мой вопрос: как я могу определить правильный корневой каталог программно?
Например, на одном хосте установка выглядит так:
$_SERVER['DOCUMENT_ROOT'] == '/htdocs'
Реальные корни документа:
test.example.com -> /data/htdocs/example.com/test www.example.com -> /data/htdocs/example.com/www
И мне нужен сценарий, который запускается с сайта www.example.com/blog/
(на пути /data/htdocs/example.com/www/blog
), чтобы получить правильное значение /data/htdocs/example.com/www
.
На другом хосте установка немного отличается:
$_SERVER['DOCUMENT_ROOT'] == '/srv' test.example.com -> /home/virtual_web/example.com/public_html/test www.example.com -> /home/virtual_web/example.com/public_html/www
Есть ли какие-либо решения? Или это единственный способ просто не полагаться на $_SERVER['DOCUMENT_ROOT']
и исправить все программное обеспечение, которое я запускаю на своих сайтах? Исправление этого на стороне хостинга, похоже, не является вариантом, я еще не столкнулся с хостом, где он был настроен правильно. Лучшее, что я получил, это корень документа, указывающий на www.example.com, который был по крайней мере внутри open_basedir – они использовали еще одну схему именования, www.example.com укажет на /u2/www/example_com/data/www/
.
В PHP5 есть волшебная константа __FILE__
которая содержит абсолютный путь к файлу, в котором она появляется. Вы можете использовать его в сочетании с dirname для вычисления корня документа.
Вы можете поместить оператор в следующем виде в файл конфигурации
define ('DOCUMENT_ROOT', dirname(__FILE__));
это должно сделать трюк
Нет необходимости изменять все сценарии.
Вы можете запустить PHP-файл до запуска любого скрипта с помощью auto_prepend_file
.
$_SERVER
– это просто массив, вы можете его изменить и установить правильный $_SERVER['DOCUMENT_ROOT']
.
Это одна из причин, по которым люди перебирают все через bootstrap /index.php, используя htaccess и / или строки запроса. Вы можете использовать трюк dirname( __FILE__ )
указанный выше, и таким образом получить общедоступную базу своего приложения.
Если вы слишком далеко переходите к нему, чтобы переключиться на одну точку входа, одна вещь, которую я видел у людей, – это общий заголовок для их скрипта, который подбирает дерево каталогов, чтобы найти файл, который уникален для базового каталога:
function findAppBase( $dir ) { if( file_exists( "$dir/unique_file.txt" ) ) { return $dir; return findAppBase( dirname( $dir ) ); } $base = findAppBase( dirname( __FILE__ ) );
Этот код не был протестирован, и может быть использование slicker с использованием vars в $_ENV
или $_SERVER
которые будут делать то, что вы хотите …
На основе http://www.helicron.net/php/ :
$localpath=getenv("SCRIPT_NAME"); $absolutepath=getenv("SCRIPT_FILENAME"); $_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));
Мне пришлось изменить basename / realpath трюк, потому что он вернул пустую строку на моем хосте. Вместо этого я использую SCRIPT_FILENAME
. Вероятно, это больше не будет работать на IIS (но исходные скрипты, которые использовали переменную $ _SERVER, вероятно, тоже не будут).
PHP должен установить текущий каталог на тот, в котором находится скрипт, так как это не сломано, вы должны иметь возможность выяснить корень документа, используя $_SERVER['SCRIPT_FILENAME']
и getcwd()
. (Я не могу вспомнить все vSERVER vars с головы, возможно, что-то в phpinfo () было бы более полезным.)
Почему бы не потребовать, чтобы ваш веб-хост правильно настроил серверы?
эти вещи, как правило, замирают в вашем коде и никогда не удаляются (но все еще активны), пока кто-то окончательно не зафиксирует сервер. Все снова сломается.
Или переместите свой материал на хост, который будет работать. Если это сломано, кто знает, что вы найдете дальше.