X-Requested-With / HTTP_X_REQUESTED_WITH奇怪的问题

时间:2009-01-19 18:27:57

标签: django cherokee

我正在构建一个Django网站并尝试使用request.is_ajax()功能......但是它只在本地工作 而且它让我发疯了!< / p>

我正处于倾倒标题的位置。这里(在django测试服务器上)有HTTP_X_REQUESTED_WITH,但在生产服务器(cherokee + scgi)上,我得到的是X-Requested-With

我使用了firebug来窥探发送的标头,它是X-Requested-With(在网站的两个版本上)。我非常非常非常困惑。任何人都可以解释发生了什么以及我如何解决它而不会失去理智?

2 个答案:

答案 0 :(得分:3)

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

所以看来你的问题是切诺基/ scgi链中的某些东西没有正确地重写标题。您使用哪种scgi实现?

答案 1 :(得分: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_ *标题吗?