【问题标题】:POST sent via AJAX comes out empty通过 AJAX 发送的 POST 为空
【发布时间】:2013-02-15 15:47:45
【问题描述】:

所以我有以下 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 变量仍然为空。

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

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

根据其他线程的建议,我还尝试了var_dump() 上的$_POSTfile_get_contents('php://input'),它们都出现为空。出于所有意图和目的,后端只是没有收到任何 POST 数据。

从我的 Inspector 的网络部分,我可以看到 确实发送了 AJAX 调用,并且“表单数据”部分包含 which: something.html 应该是这样。请求返回 404 Not Found 状态码。但是,我确实知道,在确实为 AJAX 请求返回“测试”之前,确实联系了正确的控制器,将 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 更适合服务器故障,但由于我是程序员而不是系统管理员,我想看看这里是否有人有任何想法。谢谢!

【问题讨论】:

  • 您是否尝试过将 which 包裹在引号 - {"which": file}
  • 当您尝试 yoursite/load 时会显示什么?
  • 你在那儿缺少 site_url()....$.post(&lt;?php echo site_url('load') ?&gt;.......
  • @asprin 在 JSON 中是必需的,但在 Javascript 中不需要
  • @EmphramStavanger 尝试diffing 两个.ini 文件

标签: php ajax .htaccess codeigniter post


【解决方案1】:

根据 Jan Dvorak 的尖锐建议,我将当前环境的配置与代码上次运行时的配置进行了比较,并确保启用的 Apache 模块和 PHP 扩展的列表是相同的。

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

  • auth_digest_module
  • dav_lock_module
  • headers_module
  • info_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 就为我解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2018-03-08
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多