Я в процессе переноса многих сайтов со старой конфигурации сервера на новую. Каждый сайт основан на похожей (но, к сожалению, не идентичной) кодовой базе с использованием URL-адресов mod_rewrite.
В основном работает как шарм, но в новой конфигурации $ _SERVER ['REDIRECT_URL'] больше не установлен, и код не работает из-за зависимости от этой глобальной переменной.
Насколько я понимаю, эта переменная устанавливается Apache при перенаправлении. Очевидно, сейчас этого не происходит, но я пытаюсь найти причину.
Я бы предпочел не редактировать код на каждом сайте, поэтому при необходимости я установлю глобальный PHP auto_prepend, но в идеале я хотел бы исправить конфигурацию сервера и установить это в первую очередь.
Возможно, связано: теперь у меня также есть пара новых переменных $ _SERVER, а именно REDIRECT_SCRIPT_URL и REDIRECT_REDIRECT_SCRIPT_URL. Кажется, у них есть правильные данные, которые я хочу для REDIRECT_URL, но также похоже, что произошло два внутренних перенаправления, которых не было раньше - поиск Google для REDIRECT_REDIRECT_SCRIPT_URL возвращает только случайные выходные данные var_dump. SCRIPT_URL - это новый REDIRECT_URL?
Повторная проверка REDIRECT_URL (сейчас) установлен, но всегда на 'index.php' (цель mod_rewrite) вместо ожидаемого типизированного URL. Я прибег к использованию PHP auto_prepend_file, чтобы вручную установить необходимую переменную.
Не знаю, как я пропустил это в первый раз, но за это время я внес несколько изменений, так что полагаю, есть вероятность, что его там не было. Прошу прощения, если это кого-то введет в заблуждение.
Чтобы устранить упоминания об ErrorDocument ниже, используется правило mod_rewrite:
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
Переменная $ _GET ['url'] установлена, поэтому правило должно работать.
Чтобы было ясно, на данном этапе я использовал обходной путь auto_prepend_file, о котором я упоминал изначально.
REDIRECT_URL устанавливается только веб-сервером Apache, и только при определенных обстоятельствах. Вероятно, ваш код не должен полагаться на это. Насколько я могу судить, лучшим решением было бы исправить ошибочный код PHP; вы не можете заставить это всегда быть установлено в Apache.
Для отсутствующих изображений в одном из наших проектов, которые были перенаправлены на index.php, я просто использовал это исправление:
<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";
Если вам нужно глобальное решение, я думаю, вам нужно использовать explode () и т.д. и использовать другую заданную переменную, например $ _SERVER ['REQUEST_URI'].
Согласно документации PHP:
$ _SERVER - это массив, содержащий такую информацию, как заголовки, пути и расположение скриптов. Записи в этом массиве создаются веб-сервером. Нет гарантии, что каждый веб-сервер предоставит что-либо из этого; серверы могут опускать некоторые или предоставлять другие, не перечисленные здесь. При этом большое количество этих переменных учитывается в »Спецификация CGI / 1.1, так что вы можете ожидать их.
Так казалось бы не все $_SERVER
суперглобальные переменные настолько независимы от платформы, как и следовало ожидать. $_SERVER['REQUEST_URI']
похоже, это одно из таких значений, которое последовательно определяется всеми основными веб-серверами, поэтому вы можете попробовать использовать его вместо этого.
Вы можете настроить автоматический добавляемый файл php, чтобы включить небольшой фрагмент кода PHP, который устанавливает эту переменную.