通过AJAX发送的POST是空的

时间:2013-03-01 07:29:58

标签: php ajax .htaccess codeigniter post

所以我有以下jQuery块;

var file = "something.html";
$.post("/load", {which: file}, function(data){
  // do stuff
});

应该调用加载文件的后端。 load控制器(我在CodeIgniter 2.1.3上)看起来像这样;

class Load extends MY_Controller {
    public function index()
    {
        $file = $this->input->post("which");
        $content = get_file_contents($file);
        echo $content;
    }
}

但是,出于某种原因,$file变量仍为空。

现在,我已经通过将load更改为$this->input->post()并从浏览器访问该页面来测试$this->input->get()控制器确实有效 (例如/load?which=something.html);加载并回显正确的文件。

我使用普通$_POST 变量而不是CodeIgniter处理程序调试了代码。 $_POST["which"]出现未定义的索引错误。

根据其他主题的建议,我还在var_dump()$_POST 上尝试了file_get_contents('php://input'),并且它们都是空的。对于所有意图和目的,后端只是没有收到任何POST数据。

从我的Inspector的网络部分,我可以看到 AJAX调用确实已发送,“表单数据”部分包含which: something.html。该请求将返回404 Not Found状态代码。但是,我确实知道确实联系了正确的控制器,因为在它确实为AJAX请求返回“test”之前,将echo "test"; exit;添加到控制器中。

就我在网上找到解决方案候选人而言,我的php.ini应该是正确的;我确保variables_order包含Ppost_max_size是合理的大小。正如一些回答者提出它可能是一个.htaccess重定向的东西,我确实尝试在JS请求的URL中添加一个尾部斜杠,但都无济于事。

这是我的.htaccess供参考;

# Customized error messages.
ErrorDocument 404 /index.php

# Set the default handler.
DirectoryIndex index.php

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php/$1 [L,QSA]
</IfModule>

这个代码在过去一直有用,但现在我在一台全新安装的Apache(2.2.22)和PHP(5.3.13)的新计算机上,这让我相信这很有可能Apache或PHP的某种配置问题。我不知道是否这使得这个线程比Stack Overflow更适合Server Fault,但由于我是程序员而不是系统管理员,我想看看这里是否有人有任何想法。谢谢!

1 个答案:

答案 0 :(得分:0)

基于Jan Dvorak的尖锐建议,我将当前环境的配置与代码最后工作环境的配置进行了比较,并确保启用的Apache模块和PHP扩展的列表完全相同。

在此过程中,除了我已经拥有的模块之外,我还打开了以下Apache模块;

  • auth_digest_module
  • dav_lock_module
  • headers_module
  • info_module
  • proxy_module
  • proxy_ajp_module
  • ssl_module
  • status_module

我还打开了之前没有的以下PHP扩展;

  • php_bz2
  • php_curl
  • php_exif
  • php_gettext
  • php_imap
  • php_openssl
  • php_pdo_odbc
  • php_pdo_sqlite
  • php_soap
  • php_sockets
  • php_sqlite
  • php_sqlite3
  • php_xmlrpc

比我更聪明的人可以告诉我哪个模块或扩展或其组合是此问题的确切解决方案。

但是,对我来说,启用这些模块和扩展程序可以让我确保我的环境与之前的环境类似,在这种情况下,解决了我的问题,无需更改代码或.htaccess