X-Requested-With / HTTP_X_REQUESTED_WITH странная проблема - PullRequest
3 голосов
/ 19 января 2009

Я создаю сайт Django и пытаюсь использовать функцию request.is_ajax() ... Но он работает только локально и сводит меня с ума!

Я в том месте, где только что сбросил заголовки. Здесь (на тестовом сервере django) есть HTTP_X_REQUESTED_WITH, но на рабочем сервере (cherokee + scgi) все, что я получаю, это X-Requested-With.

Я использовал firebug для отслеживания отправленных заголовков, и это X-Requested-With (в обеих версиях сайта). Я очень, очень в замешательстве. Кто-нибудь может объяснить, что происходит и как я могу обойти это, не сходя с ума?

Ответы [ 2 ]

3 голосов
/ 21 января 2009

по отношению к X-Requested-With => HTTP_X_REQUESTED_WITH, это соответствует спецификациям CGI. Поскольку FastCGI, SCGI и WSGI основаны на спецификациях CGI, разработчики Django решили придерживаться этого соглашения (FWIW, класс ModPythonRequest выполняет одинаковую перезапись для согласованности).

Так что, похоже, ваша проблема в том, что что-то в цепочке чероки / scgi неправильно переписывает заголовки. Какую реализацию scgi вы используете?

2 голосов
/ 19 января 2009

В настоящее время я работаю над этой проблемой с небольшим количеством 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, а почему нет.

Изменить: Причина, по-видимому, глубоко внутри реального веб-сервера.

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_ *?

...