Подтвердить что ты не робот

Повторно ввести $HTTP_POST_VARS в PHP 5.3

Мне нужно запустить устаревшее приложение PHP в среде совместного размещения. Я пообещал своему клиенту, что некоторое время поддерживаю это устаревшее приложение, но обнаружил, что он не работает, потому что он широко использует устаревший $HTTP_POST_VARS.

Снижение рейтинга PHP не является вариантом. Исправление приложения может быть неосуществимым, поскольку файлы PHP генерируются из исполняемого файла Windows (я не шучу!), И каждый раз, когда сайт восстанавливается с рабочего стола, мы можем потерять изменения.

Я спрашиваю, есть ли способ сказать PHP повторно ввести $HTTP_POST_VARS для всех сайтов на хосте или только для определенного vhost. Любые другие варианты/предложения оценены

4b9b3361

Ответ 1

Вы можете сделать это

config.php

$HTTP_POST_VARS = &$_POST;
$HTTP_GET_VARS = &$_GET;
$HTTP_COOKIE_VARS = &$_COOKIE;

.htaccess

php_value auto_prepend_file /path/to/config.php

PHP doc строка auto_prepend_file

Задает имя файла, который автоматически анализируется перед основным файлом. Файл включен, как если бы он был вызван с помощью функции require, поэтому используется include_path.

Специальное значение none отключает автоматическое добавление.

РЕДАКТИРОВАТЬ: Чтобы быть более тщательным, это другие суперглобалы, которые также могут быть псевдонимом:

$HTTP_SERVER_VARS = &$_SERVER;
$HTTP_POST_FILES = &$_FILES;
$HTTP_SESSION_VARS = &$_SESSION;
$HTTP_ENV_VARS = &$_ENV;

Ответ 2

Как насчет чего-то вроде

$HTTP_POST_VARS = $_POST;

Если вы можете включить код на страницах, это должно сработать. Конечно, вы должны иметь доступ к исходному коду и перекомпилировать exe в windows, но вы сказали, что можете.

Ответ 3

register_long_arrays работает для 5.3, но они вызвали это в php 5.4

http://www.php.net/manual/en/ini.core.php#ini.register-long-arrays

И да, этот параметр недоступен PHP_INI_PERDIR, поэтому вы можете установить его через отдельный .htaccess или отдельные ini файлы, а также установить его глобально.

Ответ 4

Похоже, что следующее может работать.

Сначала создайте edisplaypatch.php где-нибудь со следующим кодом

<?php

if (getenv('EDISPLAY_PATCH')) {
    if (!isset($HTTP_GET_VARS)) $HTTP_GET_VARS = $_GET;
    if (!isset($HTTP_POST_VARS)) $HTTP_POST_VARS = $_POST;
    if (!isset($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = $_COOKIE;
}

?>

Этот код может быть обобщен и повторно использован с любой другой программой, требующей старых длинных массивов

Затем в конфигурации Apache vhost добавьте

SetEnv EDISPLAY_PATCH true

Перезагрузите Apache.

Тестовый код работает: если SetEnv отсутствует, ничего не отображается, если присутствует, показывает, что вы отправляете как параметр rnd в querystring

<?php
echo $HTTP_GET_VARS['rnd'];
//phpinfo();
?>

Небольшой недостаток: я включаю файл в каждый запрос PHP