12

共有ホスティング環境でレガシーPHPアプリケーションを実行する必要があります。しばらくの間、そのレガシーアプリケーションをサポートすることを顧客に約束しましたが、非推奨のアプリケーションが広く使用されているため、機能しないことがわかりました$HTTP_POST_VARS

PHPのダウングレードはオプションではありません。PHPファイルはWindows実行可能ファイルから生成されるため(冗談ではありません!) 、アプリケーションにパッチを適用することは不可能であり、サイトがデスクトップから再生成されるたびに変更が失われる可能性があります。

$HTTP_POST_VARSホスト上のすべてのWebサイトに対して、または特定の仮想ホストに対してのみ再導入するようにPHPに指示する方法があるかどうかを尋ねています。他のオプション/提案は大歓迎です

4

4 に答える 4

22

あなたはこれを行うことができます

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ドキュメントauto_prepend_file文字列

メインファイルの前に自動的に解析されるファイルの名前を指定します。ファイルはrequire関数で呼び出されたかのようにインクルードされるため、include_pathが使用されます。

特別な値noneは、自動付加を無効にします。

編集:さらに徹底的に言うと、これらはエイリアス化できる他のスーパーグローバルです:

$HTTP_SERVER_VARS = &$_SERVER;
$HTTP_POST_FILES = &$_FILES;
$HTTP_SESSION_VARS = &$_SESSION;
$HTTP_ENV_VARS = &$_ENV;
于 2012-10-19T16:45:42.670 に答える
2

のようなものはどうですか

$HTTP_POST_VARS = $_POST;

ページにコードを含めることができれば、それは機能するはずです。もちろん、ソースコードにアクセスし、Windowsでexeを再コンパイルする必要がありますが、可能であると述べました。

于 2012-10-19T16:28:19.973 に答える
2

register_long_arrays5.3で動作しますが、php5.4ではこれを無効にしました

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

はい、この設定はラベルPHP_INI_PERDIR付けされているため、個別の.htaccessまたは個別のiniファイルを介して設定することも、グローバルに設定することもできます。

于 2012-10-19T16:40:24.813 に答える
0

次のように動作するようです。

まず、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の仮想ホスト構成に追加します

SetEnv EDISPLAY_PATCH true

Apacheをリロードします。

テストコードは機能します。SetEnvが存在しない場合は何も表示されません。存在する場合はrnd、クエリ文字列でパラメータとして送信したものが表示されます。

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

小さな欠点:すべてのPHPリクエストにファイルを含めています

于 2012-10-19T16:33:49.287 に答える