当Node应用程序返回4xx时,IIS返回500

时间:2014-03-21 03:28:49

标签: node.js azure iis iisnode

我也在iisnode github project

上问了这个问题

我通过Windows Azure网站使用IISNode。

如果我的节点应用程序返回2xx状态代码(200,201等),那么一切都很好并按预期工作。

如果我的Node应用程序返回4xx状态代码,例如: response.send(404, "not found")(我正在使用Restify)然后我收到一个500发送到客户端,正文就是"由于发生内部服务器错误,页面无法显示。"

如果我azure site log tail <sitename>,那么当500被发送到客户端时,日志包含404的HTML。

...
<body> 
<div id="content"> 
<div class="content-container"> 
<h3>HTTP Error 404.0 - Not Found</h3> 
<h4>The resource you are looking for has been removed, had its name changed,
or is temporarily unavailable.</h4> 
</div> 
...

我真的只是想让IISNode / IIS接收我的404并将其发送到客户端。对于401s,409s等也是如此。它们都会导致500被发送。

我在web.config中尝试过<customErrors mode="off" /><httpErrors existingResponse="passThrough" />无济于事。这是我的web.config现在:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <customErrors mode="off" />
  </system.web>
  <system.webServer>         
    <httpErrors existingResponse="PassThrough" />
    <staticContent>
       <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
       <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
    </staticContent>
    <handlers>
      <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
    </handlers>
    <rewrite>
      <rules>
        <rule name="DynamicContent">
           <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
           </conditions>
           <action type="Rewrite" url="server.js"/>
           <match url="/*" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

对于它的价值,我无法让IISnode做任何事情,只能从我的节点应用程序返回200秒。试图让IIS提供我的静态文件,启用节点检查器,或者实际上任何更有趣的IISNode功能都会为我带来500。不知道为什么,并且愿意超越它!

类似StackOverflow问题

this question几乎完全我的问题。除了<httpErrors existingResponse="PassThrough" />对我不起作用。我觉得我的IISNode设置存在一些根本性的错误,所以如果有人对任何事情有任何想法,我会全力以赴。

5 个答案:

答案 0 :(得分:3)

由于某种原因,配置中的以下部分导致此问题:

<staticContent>
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
    <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
</staticContent>

作为解决方法,请尽可能删除此部分并重试。我将调查此部分导致此问题的原因。

答案 1 :(得分:1)

正如Ranjith指出的那样,staticContent部分是冲突的原因。我刚刚发现您可以限制location条目中的条目,因此您可以根据需要获取所有IISNode,并仍然提供静态内容。我的web.config现在看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <customErrors mode="off" />
  </system.web>
  <system.webServer>
    <handlers>
      <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
    </handlers>
    <rewrite>
      <rules>
        <rule name="Redirect to https" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="off" ignoreCase="true" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Found" appendQueryString="true" />
        </rule>

        <rule name="StaticContent">
          <action type="Rewrite" url="public{REQUEST_URI}"/>
        </rule>

        <rule name="DynamicContent">
           <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
           </conditions>
           <action type="Rewrite" url="server.js"/>
        </rule>
      </rules>
    </rewrite>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

 <location path="public/fonts">
    <system.webServer>
      <staticContent>
         <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
      </staticContent>
    </system.webServer>
  </location>
</configuration>

最后添加的location条目适用于500和静态内容冲突。

答案 2 :(得分:0)

我从Azure / IIS返回完全相同的... 500错误页面。我使用Azure自动生成的web.config作为基础,然后添加了<customErrors mode="off" /><httpErrors existingResponse="PassThrough" />。我还删除了默认的staticContent节点。没有什么工作。

以下是我上传到Azure的web.config。这里的内容是什么导致IIS / iisnode返回500错误页面而不是我有node / express返回客户端的简单文本错误消息?

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <customErrors mode="off" />
  </system.web>
  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
    <webSocket enabled="false" />
    <handlers>
      <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
    </handlers>
    <rewrite>
      <rules>
        <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="^server.js\/debug[\/]?" />
        </rule>
        <rule name="DynamicContent">
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
          </conditions>
          <action type="Rewrite" url="server.js"/>
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

答案 3 :(得分:0)

这对我有用:

<?xml version="1.0" encoding="utf-8"?> 
  <configuration>
    <system.webServer>
      <handlers>
        <add name="iisnode" path="app.js" verb="*" modules="iisnode"/>
      </handlers>
      <rewrite>
        <rules>
          <rule name="DynamicContent">
            <match url="/*" />
            <action type="Rewrite" url="app.js"/>
          </rule>
        </rules>
      </rewrite>
    </system.webServer>
  </configuration>

答案 4 :(得分:0)

我遇到了同样的问题(Win Server 2012R2上的IIS节点)。所以我没有得到体内的目标含量。

一开始我有回应:

code: 400
body: Bad Request

然后我添加了<httpErrors existingResponse="PassThrough" />并且得到了答复:

code: 500
body: The page cannot be displayed because an internal server error has occurred

然后,我已将“错误页面”的IIS功能委派更改为“读/写”,这解决了我的问题。终于我有了适当的回应:

code: 400
body: { "error": {...} }

我希望这会有所帮助。