PHP $_SERVER['...']
переменные, такие как для 'PHP_SELF'
, 'SCRIPT_NAME'
, 'REQUEST_URI'
меня немного смущает. Я видел (по крайней мере, некоторые) предыдущие вопросы по этому поводу и могу провести некоторое тестирование в некоторых средах, но я столкнулся со средами, в которых происходят неожиданные вещи.
Я пишу приложения, которые должны быть установлены в любом подкаталоге ниже корня документа. Например, предположим, что корень документа /var/www/html
и что приложение установлено в /var/www/html/sub/dir
, Мне необходимо require()
файлы в /var/www/html/sub/dir
(или подкаталоги к этому) и ссылки на файлы в www.example.com://sub/dir
, Позвоните ‘/ sub / dir’ SUB_DIR. Я также хочу переписать правила для дружественных URL, таких как www.example.com/sub/dir/route/key1/val1/key2/val2
,
у меня есть .htaccess
для Apache и web.config для IIS, чтобы сделать мои переписывает, чтобы отправить все через /var/www/html/sub/dir/index.php
, Я не сталкивался с необходимостью выяснить, nginx или другие.
Я делал что-то вроде следующего, но с большим вниманием относился к одним проблемам и к разделителям каталогов Windows v. Real world.
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$reqUrl = $_SERVER['REQUEST_URI'];
$pwd = __DIR__; /* Occuring in www.example.com/sub/dir/index.php) */
/* Expected example value for $pwd: /var/www/html/sub/dir */
$appLinkDir = substr($pwd, strlen(docRoot));
/* Expected example value for $appLinkDir: /sub/dir */
$workingRequest = substr($_SERVER['REQUEST_URI'], strlen(appLinkDir));
/* Expected example value for $workingRequest: /route/key1/val1/key2/val2 */
Я столкнулся со средой, где $ pwd — это / var / www / html вместо / var / www / html / sub / dir. Я предполагаю, что приложение было установлено в / var / www / html (не / var / www / html / sub / dir), но они делали глобальные изменения в /sub/dir/index.php (или что-то еще). В любом случае, неожиданное значение $ pwd дало мне неожиданные значения для $ appLinkDir и $ workingRequest.
Проблемная среда была получена от стороннего рецензента кода, который предположил, что мое приложение должно быть установлено в /var/www/html/sub/dir
когда он на самом деле ожидал узнать, где он был установлен.
Любые хорошие (или даже плохие) идеи о том, как я могу получить правильные значения для $appLinkDir
а также $workingRequest
?
__DIR__
дает вам путь к каталогу, в котором файл php находится на диске.
Он не изменится, если вы не переместите php-файл на диск.
Так что, если файл находится под /var/html/sub/another/dir/index.php
__DIR__
было бы /var/html/sub/another/dir/
,
Всегда используйте __DIR__
для включения других ресурсов PHP.
Теперь для части перезаписи URL:
Я столкнулся с подобной проблемой, и я просто передал весь URI запроса в мой php-скрипт и провел там разбор.
Например:
<?php
echo $_SERVER['REQUEST_URI'];
С переписать (для lighttpd в качестве ссылки):
url.rewrite-once = (
# I don't want to route PNG, CSS files with PHP..
"^/_assets/(.*)$" => "/_assets/$1",
"/(.*)$" => "index.php?$1")
Если вы получаете доступ /test/blub/blab/
PHP-скрипт вызывается и печатает полный URI:
/test/blub/blab/
Других решений пока нет …