Я создаю 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.
У меня была аналогичная проблема с 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 привело к:
200 OK
Я бы не назвал это решение, это больше заменяет одну проблему другой. К счастью, эта новая проблема в моей ситуации была меньше первоначальной.