Междоменный AJAX withCredentials, PHP возвращает длину заголовка заголовка, но без содержимого

Я пытаюсь отправить запрос перекрестного домена со страницы в одном домене на сервер PHP в другом домене. Все работает отлично без учетных данных (мне нужна сессия), но как только я добавляю учетные данные, это не работает.

Вот код JS:

var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://phpserver.net',true); xhr.withCredentials = true ; xhr.onreadystatechange = function(e) { if (this.readyState == 4 && this.status == 200) { alert(this.responseText); } } xhr.send(); 

Помните, что он работает без верительных грамот. Теперь нет предупреждения. Поэтому я проверил Firebug в сети:

Запрос корректно обрабатывается сервером, он принимается с кодом HTTP 200, но содержимого нет. Я проверил заголовки:

HTTP / 1.1 200 OK

Дата: пт, 14 июн 2013 17:20:19 GMT

Сервер: Apache / 2.4.2 (Win64) PHP / 5.4.3

X-Powered-By: PHP / 5.4.3

Access-Control-Allow-Origin: *

access-control-allow-credentials: true

Истекает: Чт, 19 ноября 1981 г. 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0

Pragma: no-cache

Set-Cookie: key = 441wqr3e4cf2456c763c1ea173aa06b5ad284e5f38; expires = Fri, 28-Jun-2013 17:20:19 GMT key2 = 248fbaf41cdd698549fdddb341927885; expires = Пт, 28-июня-2013 17:20:19 GMT

Контент-длина: 8

Keep-Alive: timeout = 5, max = 100

Подключение: Keep-Alive

Content-Type: text / html; кодировка = UTF-8

И, наконец, мое странное открытие: заголовок «Content-Length» фактически показывает реальную длину контента! Если я добавлю эхо «foo», увеличение длины контента на три и так далее.

Я просмотрел множество вопросов, но этот вопрос действительно сложный, и я не могу найти решение 🙁

EDIT : Я забыл упомянуть, что этот запрос работает, если вместо объекта xmlHttpRequest я использую пользовательский скрипт и функцию GM_xhr.

При установке заголовка Access-Control-Allow-Credentials в значение true вы не можете использовать подстановочный знак для заголовка Access-Control-Allow-Origin . То есть конкретный хост должен быть указан.

Вместо:

 Access-Control-Allow-Origin: * 

Использование:

 Access-Control-Allow-Origin: http://safedomain.com 

Вы даже можете настроить заголовок Access-Control-Allow-Origin заголовку Origin полученному в запросе. Не уверен в PHP, но используя API-интерфейсы Java Servlets:

 String origin = request.getHeader("Origin"); request.setHeader("Access-Control-Allow-Origin", origin);