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

私は現在、基本的に「間違った」ヘッダーを探し、存在する場合は同じ値の新しいヘッダーを追加する小さなミドルウェアで問題を回避しています。

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 に答える