Apache добавляет эти префиксы REDIRECT_, чтобы сценарии могли лучше обрабатывать то, что произошло. Для моего приложения я написал функцию для решения этой проблемы. В моем случае это метод класса, но вы можете легко превратить его в глобальную функцию.
class MyClass {
/** @var integer How deep the redirect layers of Apache go. -1 means not set. */
private $redirectLevel = -1;
/**
* Get an environment variable with all the REDIRECT_ prefixes stripped off
*/
private function getEnv($var)
{
// Find out how deep the redirect goes
if ($this->redirectLevel == -1) {
reset($_SERVER);
$key = key($_SERVER);
$this->redirectLevel = substr_count($key, 'REDIRECT_');
}
$result = '';
$prefix = '';
for ($i = 0; $i < $this->redirectLevel + 1; $i++) {
if (isset($_SERVER[$prefix . $var])) {
$result = $_SERVER[$prefix . $var];
}
$prefix .= 'REDIRECT_';
}
return $result;
}
}
РЕДАКТИРОВАТЬ: Вышеприведенная функция возвращает содержимое переменной, которая имеет большинство префиксов REDIRECT_, как правило, то, что вы хотите. Если бы Apache не использовал префикс переменных, это то, что вы получите. Содержимое переменных может меняться в зависимости от количества префиксов. В конце концов, Apache добавляет префикс, чтобы он не перезаписывал старое значение.
Например, на моем сайте я использую mod_ssl для аутентификации клиента с помощью SSL-сертификатов клиента. Тема сертификата (содержащая адрес электронной почты пользователя) хранится в переменной SSL_CLIENT_S_DN. С префиксом Apache это будет выглядеть так:
$_SERVER['REDIRECT_REDIRECT_SSL_CLIENT_S_DN'] // string containing the subject
$_SERVER['REDIRECT_SSL_CLIENT_S_DN'] // exists, but empty
// $_SERVER['SSL_CLIENT_S_DN'] does not exist
Функция getEnv (), которую я написал выше, вернет верхнюю.