Windows Yii2 REST API IIS对象已移动

Windows Yii2 REST API IIS对象已移动,windows,rest,api,iis,yii2,Windows,Rest,Api,Iis,Yii2,我正在使用yii2rest和ActiveController创建一个新的Pessoa(),在Apache上运行正常,但在IIS 8上发生错误 有人知道IIS中的任何配置吗 请求 回应 文档已移动 对象已移动可以找到此文档 {“id”:“21”} 我也有类似的问题。这似乎与FastCGI有关。我不确定。我知道在将响应头设置为201 http状态码()时会发生这种情况,IIS稍后会对其进行更改。如果您有权访问服务器,请尝试以下解决方案: 在我的例子中,我只有对服务器的FTP访问权限,因此我通过如下

我正在使用yii2rest和ActiveController创建一个新的Pessoa(),在Apache上运行正常,但在IIS 8上发生错误

有人知道IIS中的任何配置吗

请求

回应

文档已移动
对象已移动可以找到此文档
{“id”:“21”}

我也有类似的问题。这似乎与FastCGI有关。我不确定。我知道在将响应头设置为201 http状态码()时会发生这种情况,IIS稍后会对其进行更改。如果您有权访问服务器,请尝试以下解决方案:

在我的例子中,我只有对服务器的FTP访问权限,因此我通过如下方式覆盖了Create操作,强制使用200状态码而不是201:

public function actions()
{
    $actions = parent::actions();
    unset($actions['create']);
    return $actions;
}

public function actionCreate() {
    $model = new Pessoa();
    $model->load(Yii::$app->getRequest()->getBodyParams(), '');
    if ($model->save() === false && !$model->hasErrors()) {
        throw new ServerErrorHttpException('Failed to update the object for unknown reason.');
    }
    return $model;
}

以防其他人需要保留状态代码并且仅删除IIS添加的响应部分,这就是我解决问题的方法。您可能需要根据自己的需要对其进行调整,不过:

<!-- PS: In my case, i just had a one line HEAD and a one line BODY being added. -->

<outboundRules>
    <rule name="Remove the tag HEAD" preCondition="isStatus201">
        <match filterByTags="None" pattern="^\&lt;head\&gt;.*?$" />
        <action type="Rewrite" value="" />
    </rule>
    <rule name="Remove the tag BODY" preCondition="isStatus201">
        <match filterByTags="None" pattern="^\&lt;body\&gt;.*?\&lt;/body\&gt;" />
        <action type="Rewrite" value="" />
    </rule>
    <preConditions>
        <preCondition name="isStatus201">
            <add input="{RESPONSE_STATUS}" pattern="^201$" />
        </preCondition>
    </preConditions>
</outboundRules>

在IIS 8.5中测试


希望它能帮助其他人。

事实上,我能够优化正则表达式,这样一条规则就可以捕获结束正文标记的所有行:

<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>

<!-- PS: In my case, i just had a one line HEAD and a one line BODY being added. -->

<outboundRules>
    <rule name="Remove the tag HEAD" preCondition="isStatus201">
        <match filterByTags="None" pattern="^\&lt;head\&gt;.*?$" />
        <action type="Rewrite" value="" />
    </rule>
    <rule name="Remove the tag BODY" preCondition="isStatus201">
        <match filterByTags="None" pattern="^\&lt;body\&gt;.*?\&lt;/body\&gt;" />
        <action type="Rewrite" value="" />
    </rule>
    <preConditions>
        <preCondition name="isStatus201">
            <add input="{RESPONSE_STATUS}" pattern="^201$" />
        </preCondition>
    </preConditions>
</outboundRules>
<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>