W7 Pro IIS 7.5 перезаписывает местоположение PHP: заголовок (разрешен)

Я создаю RESTful API в PHP и столкнулся с проблемой. Когда клиент отправляет данные на сервер, сервер должен вернуть:

Status code 201 CREATED Header Location with the location of the new object Content-Type application/xml <SomeXmlData></SomeXmlData> 

Манекен, создающий проблему на моем компьютере:

 <?php header("Location: http://google.no/",true,201); header("Content-Type: application/xml;charset=iso-8859-1"); echo "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n"; echo "<Jada></Jada>"; ?> 

Результат HTTP

 HTTP/1.1 201 Created Content-Type: text/html; charset=UTF-8 Location: http://google.no/ Server: Microsoft-IIS/7.5 X-Powered-By: PHP/5.4.5 X-Powered-By: ASP.NET Date: Wed, 22 Aug 2012 13:52:57 GMT Content-Length: 209 <head><title>Document Moved</title></head> <body><h1>Object Moved</h1>This document may be found <a HREF="http://google.no/">here</a></body><?xml version="1.0" encoding="utf-8" standalone="yes"?> <Jada></Jada> 

PHP автоматически добавляет в ответ некоторый код HTML и тип содержимого HTML из-за заголовка местоположения.

Из-за этого мой api не будет работать со своими клиентами.

Любые решения?

EDIT: IIS 7.5 Windows 7 Proffesional Мне жаль, что я забыл эту информацию.

Решением было создание модуля IIS, который переписывает заголовок «Пользовательское местоположение» в «Местоположение» после завершения FastCGI.

Затем FastCGI не будет знать, что мы отправляем заголовок Location вообще, и он не будет изменять мой ответ.

Модуль:

 string Location = context.Response.Headers["Custom-Location"] as string; if (!string.IsNullOrEmpty(Location)) { context.Response.Headers.Remove("Custom-Location"); context.Response.AddHeader("Location", Location); } 

PHP:

 header("Custom-Location: http://google.no",true,201); header("Content-Type: application/xml"); echo "<xml></xml>"; 

(все же фиктивный код, а не экстремально правильный код :))

Прошу прощения за плохие новости, но посмотрите здесь:

Запретить IIS изменять ответ при наличии заголовка местоположения

Изменить: Никогда не нашел ответа – я перешел на Apache

И кажется, что IIS долгое время держал свои пальцы в заголовках:

http://forums.iis.net/t/1158431.aspx

Это ошибка в модуле IIS FastCGI. Он будет исправлен в RTM Windows 7. Мы также изучаем возможные способы сделать это исправление доступным для IIS 7.

Надеюсь, если ошибки будут связаны (я думаю, что они есть), если у вас теперь есть FastCGI, то исправление ниже может работать. В противном случае может работать и переход на PHP-модуль FastCGI, и это может быть проще, чем использовать Apache.

http://support.microsoft.com/kb/980363

У меня была аналогичная проблема с WP REST API в IIS 8.5. Следуя html

 <head> <title>Document Moved</title> </head> <body> <h1>Object Moved</h1> This document may be found <a HREF="[url-from-location-header]">here</a> </body> 

был добавлен в начале каждого json, возвращенного с заголовком Location и 201 Created статусом 201 Created . Content-Type был изменен на text/html; charset=UTF-8 text/html; charset=UTF-8 .

Добавление cgi.rfc2616_headers = 1 в php.ini привело к:

  • очистить тело (json) без добавления html
  • правильный «Content-Type»
  • Недопустимый заголовок «Location»
  • Состояние выполнено до 200 OK

Я бы не назвал это решение, это больше заменяет одну проблему другой. К счастью, эта новая проблема в моей ситуации была меньше первоначальной.