Я нахожусь в процессе миграции многих сайтов со старой конфигурации сервера на новую. Каждый сайт основан на похожей (но, к сожалению, не идентичной) кодовой базе с использованием URL-адресов mod_rewrite.
- Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
- Apache 2.22.8 => Apache 2.2.22
- PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)
В основном работает как шарм, но в новой конфигурации $ _SERVER ['REDIRECT_URL'] больше не устанавливается, и код не выполняется из-за зависимости от этой глобальной переменной.
Насколько я понимаю, эта переменная устанавливается Apache, когда происходит перенаправление. Очевидно, сейчас этого не происходит, но я изо всех сил пытаюсь найти причину.
- Это обновление Apache или (по-моему) переход с PHP FastCGI на PHP5-FPM?
- Как мне вернуть эту переменную?
Я бы действительно не хотел редактировать код на каждом сайте, поэтому при необходимости я установлю глобальный PHP auto_prepend для PHP, но в идеале я бы хотел исправить конфигурацию сервера и иметь этот набор в первую очередь.
Потенциально связаны: теперь у меня также есть пара новых переменных $ _SERVER, а именно REDIRECT_SCRIPT_URL и REDIRECT_REDIRECT_SCRIPT_URL. Кажется, они содержат правильные данные, которые я хочу для REDIRECT_URL, но также указывают на то, что произошли два внутренних перенаправления, которых раньше не было - Google ищет REDIRECT_REDIRECT_SCRIPT_URL, возвращает только случайные выходные данные var_dump. Является ли SCRIPT_URL новым REDIRECT_URL?
Редактировать 1
Повторная проверка REDIRECT_URL (сейчас) установлена, но всегда в «index.php» (цель mod_rewrite) вместо ожидаемого набранного URL. Я прибегнул к использованию PHP auto_prepend_file, чтобы вручную установить необходимую переменную.
Я не уверен, как я пропустил это в первый раз, но я тем временем внес несколько изменений, поэтому я полагаю, что есть шанс, что его там не было. Извинения, если это вводит в заблуждение кого-либо.
Редактировать 2
Чтобы учесть упоминания ErrorDocument ниже, используется правило mod_rewrite:
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
Переменная $ _GET ['url'] установлена, поэтому правило должно работать.
Чтобы было ясно, на этом этапе я использовал обходной путь auto_prepend_file, который я упомянул изначально.