5

我正在用 PHP 创建一个 RESTful API,但遇到了问题。当客户端向服务器发送数据时,服务器应该返回:

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 不能与它的客户一起工作。

编辑:IIS 7.5 Windows 7 专业版

4

4 回答 4

5

我很抱歉承受坏消息,但请看这里:

防止 IIS 在存在 Location 标头时更改响应

编辑:从来没有找到答案 - 我最终切换到 Apache

似乎 IIS 长期以来一直在关注标头:

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

这是 IIS FastCGI 模块中的一个错误。它将在 Windows 7 RTM 中修复。我们还在研究使此修复可用于 IIS 7 的可能方法。

希望如果这些错误是相关的(我希望它们是相关的),如果您现在拥有 FastCGI,那么下面的修复可能会起作用。否则,切换到 PHP 非 FastCGI 模块也可能会起作用,而且它可能比使用 Apache 更容易。

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

于 2012-08-22T14:03:11.543 回答
4

解决方案是创建一个 IIS 模块,在 FastCGI 完成后将标题“Custom-Location”重写为“Location”。

然后,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>";

(仍然是虚拟代码,不是非常正确的代码:))

于 2012-08-27T11:46:33.810 回答
2

我对 IIS 8.5 上的 WP REST API 有类似的问题。以下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>

Location在每个带有header 和 status返回的 json 的开头添加201 CreatedContent-Type已更改为text/html; charset=UTF-8.

添加cgi.rfc2616_headers = 1php.ini 导致:

  • 干净的正文(json),不添加 html
  • 正确的“内容类型”
  • 缺少“位置”标题
  • 状态更改为200 OK

我不会称这个解决方案,这更像是用另一个问题代替一个问题。幸运的是,在我的情况下,这个新问题比原来的问题要小。

于 2016-03-18T07:51:05.783 回答
0

要规避此 IIS 行为,您可以使用出站重写规则。以下将查找状态 201,如果是,则消除所有内容行,包括结束 body 标记:

<outboundRules>
  <rule name="Remove injected 201 content" preCondition="Status 201">
    <match filterByTags="None" pattern="^(?:.*[\r\n]*)*.*&lt;/body>" />
    <action type="Rewrite" value="" />
  </rule>
  <preConditions>
   <preCondition name="Status 201" patternSyntax="Wildcard">
     <add input="{RESPONSE_STATUS}" pattern="201" ignoreCase="false" />
   </preCondition>
  </preConditions>
</outboundRules>
于 2021-06-11T22:26:53.050 回答