5

我也在iisnode github项目上问过这个

我通过 Windows Azure 网站使用 IISNode。

如果我的 Node 应用程序返回 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。

我已经尝试过<customErrors mode="off" />并且<httpErrors existingResponse="passThrough" />在我的 web.config 中无济于事。这是我的 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>

对于它的价值,除了从我的节点应用程序返回 200 之外,我无法让 IISnode 做任何事情。试图让 IIS 为我的静态文件提供服务,启用节点检查器,或者任何更有趣的 IISNode 功能对我来说都是 500。不知道为什么,很想克服它!

类似的 StackOverflow 问题

这个问题几乎正是我的问题。除了那<httpErrors existingResponse="PassThrough" />对我不起作用。我觉得我的 IISNode 设置有更根本的问题,所以如果有人对尝试的事情有任何想法,我会全力以赴。

4

5 回答 5

3

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

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

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

于 2014-03-21T19:45:31.600 回答
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 和静态内容冲突工作。

于 2014-04-16T13:33:51.917 回答
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>
于 2014-03-25T16:40:36.780 回答
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>
于 2014-03-25T17:31:43.050 回答
0

我有同样的问题(Win Server 2012R2 上的 IIS 节点)。所以我没有得到body中的目标内容。

一开始我的反应是:

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": {...} }

我希望这有帮助。

于 2018-12-28T18:23:09.137 回答