3

我正在构建一个 Django 站点并尝试使用该request.is_ajax()功能......但它只在本地工作,它让我发疯!

我正处于我刚刚转储标题的地步。这里(在 django 测试服务器上)有,HTTP_X_REQUESTED_WITH但在生产服务器(cherokee+scgi)上,我得到的只是X-Requested-With.

我已经使用 firebug 来窥探发送的标头,并且它是X-Requested-With(在网站的两个版本上)。我非常非常困惑。任何人都可以解释正在发生的事情以及我如何在不失去理智的情况下解决它吗?

4

2 回答 2

3

wrt/ X-Requested-With => HTTP_X_REQUESTED_WITH 的东西,它符合 CGI 规范。由于 FastCGI、SCGI 和 WSGI 都基于 CGI 规范,Django 开发人员选择坚持这个约定(FWIW,ModPythonRequest 类为了一致性做了同样的重写)。

因此,您的问题似乎是 cherokee/scgi 链中的某些内容没有正确重写标题。您使用的是哪个 scgi 实现?

于 2009-01-21T09:39:19.260 回答
2

我目前正在使用一点点 MiddleWare 来解决这个问题,它本质上是在寻找“错误”的标头,如果存在,则附加一个具有相同值的新标头:

if 'X-Requested-With' in request.META:
    request.META['HTTP_X_REQUESTED_WITH'] = request.META['X-Requested-With']

但我真的希望我知道这些标头应该发生什么,因为X-Requested-With总是发送......我不明白为什么应该翻译成HTTP_X_REQUESTED_WITH以及为什么不翻译。

编辑:原因似乎在实际的 Web 服务器中很深。

case 'X':
    if (header_equals ("X-Forwarded-For", header_x_forwarded_for, begin, header_len)) {
        ret = add_known_header (hdr, header_x_forwarded_for, val_offs, val_len);
    } else if (header_equals ("X-Forwarded-Host", header_x_forwarded_host, begin, header_len)) {
        ret = add_known_header (hdr, header_x_forwarded_host, val_offs, val_len);
    } else
        goto unknown;
    break;

我已经提交了一个错误来添加我的标头,但是所有 X-* 标头都应该转换为 HTTP_X_* 标头吗?

于 2009-01-19T20:03:19.237 回答