Windows Yii2 REST API IIS对象已移动
我正在使用yii2rest和ActiveController创建一个新的Pessoa(),在Apache上运行正常,但在IIS 8上发生错误 有人知道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访问权限,因此我通过如下
文档已移动
对象已移动可以找到此文档
{“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="^\<head\>.*?$" />
<action type="Rewrite" value="" />
</rule>
<rule name="Remove the tag BODY" preCondition="isStatus201">
<match filterByTags="None" pattern="^\<body\>.*?\</body\>" />
<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]*)*.*</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="^\<head\>.*?$" />
<action type="Rewrite" value="" />
</rule>
<rule name="Remove the tag BODY" preCondition="isStatus201">
<match filterByTags="None" pattern="^\<body\>.*?\</body\>" />
<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]*)*.*</body>" />
<action type="Rewrite" value="" />
</rule>
<preConditions>
<preCondition name="Status 201" patternSyntax="Wildcard">
<add input="{RESPONSE_STATUS}" pattern="201" ignoreCase="false" />
</preCondition>
</preConditions>
</outboundRules>