我通过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。不知道为什么,并且愿意超越它!
this question几乎完全我的问题。除了<httpErrors existingResponse="PassThrough" />
对我不起作用。我觉得我的IISNode设置存在一些根本性的错误,所以如果有人对任何事情有任何想法,我会全力以赴。
答案 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": {...} }
我希望这会有所帮助。