Заголовки и данные POST исчезают при использовании AJAX и mod_rewrite - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть экземпляр Apache 2.2.21 в Windows 7, работающий на http://localhost, который использует mod_rewrite для перенаправления запросов, начинающихся с /backend до http://localhost:8080.Сервер на http://localhost:8080, в свою очередь, является сервером CherryPy 3.2.0, который предназначен для приема сообщений JSON POSTed и ответа на них сообщениями JSON.

Моя проблема заключается в том, что когда я пытаюсь выполнить POST для http://localhost/backend с использованием AJAXСервер CherryPy в конечном итоге видит сообщение без заголовков запроса и без прикрепленных данных JSON.Таким образом, он возвращает ошибку 400 BAD REQUEST.Но у меня также есть приложения, встроенные в Excel и .NET, которые отправляют подобные сообщения на http://localhost/backend без проблем.Кроме того, я попытался настроить страницу на http://localhost/route (которая использует Django), которая передает AJAX POST на http://localhost:8080;это прекрасно работает.

Мой вопрос, почему AJAX POST к `http://localhost/backend' не работает.Возможно, это связано с безопасностью AJAX?

Пример JavaScript с использованием jQuery будет выглядеть примерно так:

$.post(
    "/backend", 
    JSON.stringify({"type": "getdata", "id": "1"}),
    function(data) {
        alert("Done");
    }
);

А соответствующий раздел файла конфигурации Apache -

RewriteEngine on
RewriteRule ^/backend http://localhost:8080 [proxy]

CherryPy работает без специальных параметров запуска:

cherrypy.config.update({'server.socket_port': 8080})
cherrypy.quickstart(MyServer())

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

На самом деле это просто случай, когда не удалось вручную включить заголовок в запрос AJAX, который указывал Content-Type как application / json.Например,

$.ajax({
...,
headers: {"Content-Type": "applicaton/json"},
...
});
0 голосов
/ 06 декабря 2011

Рассматривали ли вы использование mod_proxy и ProxyPass ?Это больше похоже на то, что вы пытаетесь сделать.Вам просто понадобится директива, подобная этой:

ProxyPass /backend http://localhost:8080/

Вы можете добавить тайм-ауты соединения, попытки повторных попыток, переписать домены cookie, даже переписать имена хостов заголовка ответа с ProxyPassReverse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...