首页 文章

关于不推荐使用`$ HTTP_RAW_POST_DATA`的警告

提问于
浏览
111

我切换到PHP 5.6.0,现在到处都收到以下警告:

Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will
be removed in a future version. To avoid this warning set
'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream
instead. in Unknown on line 0

Warning: Cannot modify header information - headers already sent in Unknown on line 0

好吧,我依靠一些不赞成的功能 . 除了我没有!

  • 我在任何脚本中都没有使用过这个变量 . 说实话,我不知道它甚至存在 .

  • phpinfo() 表示我将 always_populate_raw_post_data 设置为0(禁用) . 那么发生了什么?

我还没有弃用配置't want to 2821243 by setting this value to -1. This will just hide the warning, and I' . 我想从源头解决问题,并知道为什么PHP认为 HTTP_RAW_POST_DATA populating已打开 .

9 回答

  • 125

    事实证明,我对错误信息的理解是错误的 . 我会说它的选择非常糟糕 . 谷歌搜索我,其他人误解了这个消息,就像我一样 - 见PHP bug #66763 .

    在对Mike的那个错误做出完全无益的回应之后,Tyrael解释说,将它设置为"-1"并不会让警告消失 . 它做的是正确的,即它完全禁用填充罪魁祸首变量 . 事实证明,在某些情况下将其设置为0 STILL 会填充数据 . 谈论糟糕的设计!引用PHP RFC

    将always_populate_raw_post_data INI设置更改为接受三个值而不是两个 . -1:主人的行为;永远不要填充$ GLOBALS [HTTP_RAW_POST_DATA] 0 / off / whatever:BC行为(如果内容类型未注册或请求方法不是POST则填充)1 / on / yes / true:BC行为(总是填充$ GLOBALS [HTTP_RAW_POST_DATA])

    所以是的,将它设置为-1不仅可以避免警告,就像消息所说的那样,但它最终也会禁用填充此变量,这就是我想要的 .

  • 3

    我在nginx服务器(DigitalOcean)上遇到了同样的问题 - 我所要做的就是以 root 登录并修改文件 /etc/php5/fpm/php.ini .

    要找到 always_populate_raw_post_data 的行,我首先运行 grep

    grep -n 'always_populate_raw_post_data' php.ini
    

    那返回了 704

    704:;always_populate_raw_post_data = -1
    

    然后使用 vi 编辑器在该行上打开 php.ini

    vi +704 php.ini
    

    删除半冒号以取消注释并保存文件 :wq

    最后重启服务器,错误就消失了 .

  • 5

    有一段时间,直到我遇到这个错误 . 为可能偶然发现这个问题的人提出我的答案 .

    该错误仅表示您正在发送空POST请求 . 在没有传递参数的HTTPRequests上常见此错误 . 要避免此错误,您始终可以在不更改php.ini的情况下向POST添加参数 .

    喜欢:

    $.post(URL_HERE
        ,{addedvar : 'anycontent'}
        ,function(d){
           doAnyHere(d);
        }
        ,'json' //or 'html','text'
    );
    
  • 31

    如果你正在使用WAMP ......

    您应该在 php.ini 中添加或取消注释属性 always_populate_raw_post_data 并将其值设置为 -1 . 在我的情况下 php.ini 位于:

    C:\wamp64\bin\php\php5.6.25\php.ini

    ..但如果你仍然收到警告(就像我一样)你还应该在phpForApache.ini中设置always_populate_raw_post_data = -1:C:\ wamp64 \ bin \ php \ php5.6.25 \ phpForApache.ini如果你不能找到此文件,打开浏览器窗口并转到:http:// localhost /?phpinfo = 1并查找Loaded Configuration File键的值 . 在我的例子中,WAMP使用的php.ini位于:C:\ wamp64 \ bin \ apache \ apache2.4.23 \ bin \ php.ini(符号链接到C:\ wamp64 \ bin \ php \ php5.6.25 \ phpForApache . INI)

    最后重启WAMP(或点击重启所有服务)

  • 4

    取消注释

    always_populate_raw_post_data = -1
    

    在php.ini(第#703行)并重新启动APACHE服务帮我摆脱了消息

    ; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is
    ; to disable this feature and it will be removed in a future version.
    ; If post reading is disabled through enable_post_data_reading,
    ; $HTTP_RAW_POST_DATA is *NOT* populated.
    ; http://php.net/always-populate-raw-post-data
    ; always_populate_raw_post_data = -1
    
  • 11

    如果 .htaccess 文件不可用,则在根文件夹上创建它并超过此行代码 .

    把它放在 .htaccess 文件中(经测试适用于API)

    <IfModule mod_php5.c>
        php_value always_populate_raw_post_data -1
    </IfModule>
    
  • 30

    对于仍然在更改php.init之后仍然遇到此问题的人,如接受的答案所示 . 由于在没有任何参数的情况下通过 POST 进行ajax请求时发生错误,您只需将发送方法更改为 GET .

    var xhr = $.ajax({
       url:  url,
       type: "GET",
       dataType: "html",
       timeout: 500,
    });
    

    如果你想因任何原因保留方法 POST ,还有另一个选择是将空的JSON对象添加到ajax petititon .

    var xhr = $.ajax({
       url:  url,
       type: "POST",
       data: {name:'emtpy_petition_data', value: 'empty'}
       dataType: "html",
       timeout: 500,
    });
    
  • 5

    从html表单发送数据时我收到此错误消息(Post方法) . 我所要做的就是将表单中的编码从“text / plain”更改为“application / x-www-form-urlencoded”或“multipart / form-data” . 错误消息非常误导 .

  • -1

    ; php.init中的always_populate_raw_post_data = -1删除此行的注释.. always_populate_raw_post_data = -1

相关问题