Невідповідна косою косою рисою змінної DOCUMENT_ROOT у PHP при використанні Apache


10

У різних середовищах сервера PHP $_SERVER['DOCUMENT_ROOT']супер глобальний іноді має кінцеву косу рису, а іноді - ні. Я б подумав, що це питання безпосередньо пов'язане з тим, як визначено Apache DocumentRootу httpd.confфайлі:

тобто я б подумав, що якщо httpd.confне міститься косої косої риски:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

тоді echo $_SERVER['DOCUMENT_ROOT']слід дати / var / www / live / current

і якщо httpd.confвона містить кінцеву косу рису:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

тоді echo $_SERVER['DOCUMENT_ROOT']слід дати / var / www / live / current /

Це стосується Ubuntu 10.04, але в RHEL 5.5 додається косою косою рискою, $_SERVER['DOCUMENT_ROOT']навіть якщо в Apache не було визначено жодного.

Будь-яка ідея, чому це відбувається? Чи є параметр конфігурації, який мені не вистачає?


Довідково:

  • PHP 5.3.3 RHEL (проблема виникає): PHP 5.3.3 (cli) (побудовано: 23 липня 2010 16:26:53)
  • Версія PHP Ubuntu (без випуску): PHP 5.3.2-1ubuntu4.2 з Suhosin-Patch (cli) (побудовано: 13 травня 2010 20:03:45)

Відповіді:


6

Я поняття не маю, чому коса риса змінюється між вашими віртуальними хостами. До речі, це важливо? Просто додайте нову косу рису до своїх програм (видаліть, якщо є подвійний косий ривок) і проблема вирішена.

я використовую

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

4
Ви можете просто використовувати $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Він автоматично видаляє всі декілька косої риски, а також останню. Якщо ви завжди хочете, щоб косою косою рисою було об'єднано її в результат вищезазначеного виклику realpath(). Не всередині нього.
грип

1
Я можу підтвердити ту саму проблему (php 5.5) між хостом Hosteurope (я думаю, що Ubuntu): має косу рису ... та Windows 7: немає косої риски (досить недавно встановлено XAMPP)
Франк Нокк

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'має бути трохи швидше, ніж всі ті речі, які реально може зробити.
Френк Нокк


3

Корінь документа в середовищі Apache можна визначити в більш ніж одному місці.

Так, httpd.confмістить ці налаштування, але вони можуть бути перезаписані, оскільки цей файл використовується для конфігурації за замовчуванням.

Я б запропонував вам перейти перевірити конфігурацію vhost в розділі vhosts.dта sites-availableкаталогах.


2

Пропоноване рішення:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

працює не у всіх установках.

Наприклад, у моєму випадку:

$_SERVER['DOCUMENT_ROOT']  = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"

Та ж проблема, що і раніше.

Можливо, вам слід змінити першу інструкцію в:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";

розторопша


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'має бути трохи швидше, ніж всі ті речі, які реально може зробити.
Френк Нокк

2

Відповідь Дома є вирішенням цього питання, проте заява stefanvesca є причиною того, чому в різних середовищах ви переживаєте подвійний '//'. На локальній машині у вашому файлі .conf, де ви налаштували свій віртуальний хост, ви, швидше за все, додали / в кінці визначеного кореня документа, тоді як особа, яка створила ваше інше середовище, не зробила цього, чи навпаки.

Так чи інакше, використовуючи $ _SERVER ['DOCUMENT_ROOT'] php, ви отримуєте значення середовища apache, яке є результатом конфігурації. Це причина '/' в одному середовищі та '//' в іншому.


1

Я б сказав, що припускається, що DOCUMENT_ROOT не має останньої косої риски.

Це значення передається з конфігурації веб-сервера

апаш

DocumentRoot /var/www/html

Це означає, що ми повинні мати провідну косу рису до шляху, який ми додаємо до неї.

Знаючи, що подвійний косий рядок '//' в будь-якій точці шляху не має наслідків (якщо це стосується файлової системи ... в URL-адресі http, можуть бути випадки, коли є деякі глюки)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

Коли у DOCUMENT_ROOT є косою косою рисою, ми можемо звинувачувати sysadmin у тому, що не має наслідків :)

І сміливо це ігнорувати?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.