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 Professional

4

4 に答える 4

5

悪い知らせで申し訳ありませんが、こちらをご覧ください。

Location ヘッダーが存在する場合に IIS が応答を変更しないようにする

編集:答えが見つかりませんでした-最終的に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

解決策は、FastCGI の完了後にヘッダー「Custom-Location」を「Location」に書き換える IIS モジュールを作成することでした。

次に、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>

Locationheader と statusで返されるすべての json の先頭に追加されました201 CreatedContent-Typeに変更されましたtext/html; charset=UTF-8

cgi.rfc2616_headers = 1php.ini に追加すると、次のようになりました。

  • htmlを追加せずにきれいなボディ(json)
  • 正しい「コンテンツタイプ」
  • 「場所」ヘッダーがありません
  • に変更されたステータス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 に答える