$this->input->post() 总是返回 FALSE,因为不需要的 301


$this->input->post() always returning FALSE, due to an unwanted 301

我正在 CodeIgniter 中处理注册页面。问题是,我的帖子数据没有通过。以下代码始终生成"失败":

class Signup extends CI_Controller {
    function index()
    {    
        if ($this->input->post())
        {
            echo 'success'; 
        }
        else
        {
            echo 'fail';
            echo form_open('signup');
            echo form_input('username', 'Username');
            echo form_input('email_address', 'Email address');
            echo form_submit('submit', 'Create Acccount');
            echo form_close();
        }
    }
}

可能是什么问题?

为了使事情更加有趣,在我的本地主机上,表单工作正常。这是在远程服务器上失败时。


更新 1:根据要求,这是服务器输出的内容:(我遮盖了 URL,我没有披露)

<form accept-charset="utf-8" method="post" action="http://www.url.com/signup">
<input type="text" value="Username" name="username">
<input type="text" value="Email address" name="email_address">
<input type="submit" value="Create Account" name="submit">
</form>

更新2:我看到本地主机和远程服务器之间的另一个行为差异:在提交表单后刷新(cmd R或F5)页面时,在本地主机上,我的浏览器要求我再次发送表单。远程服务器上的同一页面不会从浏览器调用该问题,因此看起来某些重定向或 url 问题导致了问题?


更新 3:似乎在远程服务器上,用户正在被 301 重定向。(永久移动)我仍然不知道这个重定向是从哪里来的。重定向有效地杀死了后数据,因此它解释了为什么 post() 返回 false。

那么,有谁知道我为什么要成为301'd?


更新 4:通过将我的base_url设置为 http://www.url.com 而不是 http://url.com,我在 CodeIgniter 中被重定向

改变之后,它解决了问题! :)

此问题可能是由来自远程服务器的 301 重定向(位置 HTTP 标头指令)引起的。如果您使用Firefox,则可以使用插件TamperData进行检查。当然,您也可以查看http://www.url.com/signup在请求页面时是否被重定向。

如果 HTTP 标头Location http://url.com/signup(不带 www),则最简单的解决方案是将 http://url.com/signup 用于表单操作。请注意,如果表单位于同一服务器上,您也可以省略服务器地址。您可以改用/signup

您使用的是哪个版本的 CI?CI反应器对$this->input->post()进行了更改

输入类方法 post() 和 get() 现在将返回一个完整的数组,如果 未提供第一个参数。

我刚刚测试了类似的条件;我在本地主机上使用 CI Reactor ,在我的直播中使用预反应器版本,并且得到了相同的结果。

$_POST 确实包含数据。预反应器,如果没有传递数组,$this->input->post 不会返回任何内容:

$this->input->post()呼叫_fetch_from_array()

function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
{
    if ( ! isset($array[$index]))
    {
        return FALSE;
    }

然而,在反应堆中,这是完成的:

    if ($index === NULL AND ! empty($_POST))
    {
        $post = array();
        // Loop through the full _POST array and return it
        foreach (array_keys($_POST) as $key)
        {
            $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
        }
        return $post;
    }

因此,即使您没有指定索引,您也会获得帖子值。

我会从print_r()'_POST/$_REQUEST超全局变量开始,看看PHP是否看到了任何东西。这应该有助于缩小范围,看看它是 php 还是 CI 问题。

我遇到了这个问题,这是一个奇怪的修复,我无法解释为什么,但这是有效的。不要使用 html 使表单使用代码点火器表单库。出于某种原因,我尝试了两种方式

$this->input->post('your_variable'); 

仅在使用表单类时有效,请参阅代码点火器用户指南