Azure网站上的Node.js 404错误

时间:2013-10-24 01:16:13

标签: node.js azure express azure-web-sites

我正在运行Node.js 0.10.15& Azure网站上的Express应用程序,当有人输入无效的URL时发送404s时出现问题。我尝试访问无效网址时收到通用The page cannot be displayed because an internal server error has occurred.错误。

以下是发送404页面的app.js文件末尾的代码:

app.get('/*', function(req, res) { res.status(404).sendfile('public/404.html'); });

奇怪的是,当我在本地运行我的服务器时,Express似乎正在正确地发送404和HTML文件,但是当它在Azure上运行时它会窒息并且不会给我一个有用的错误。日志显示请求按预期工作:

[Thu, 24 Oct 2013 01:10:39 GMT] "GET /asdfsadf HTTP/1.1" 404 - "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"

我怀疑问题出现在我的web.config文件中:

<?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <system.webServer>
      <httpErrors existingResponse="PassThrough" />
      <staticContent>
         <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
         <mimeMap fileExtension=".woff" mimeType="application/x-woff" />
         <mimeMap fileExtension=".ttf" mimeType="application/x-woff" />
      </staticContent>
      <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>

我还使用iisnode.yml文件启用了日志记录:

loggingEnabled: true
devErrorsEnabled: true

此外,您可以在GitHub

看到我的开发工作分支

2 个答案:

答案 0 :(得分:3)

请参阅Windows Azure Websites is overriding my 404 and 500 error pages in my node.js apphttps://github.com/tjanczuk/iisnode/issues/295

两者都适合我。我的快递应用程序没有任何Web.config,这就是我使用的:

<configuration>
    <system.webServer>
      <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"/>
                </rule>
           </rules>
      </rewrite>
      <httpErrors existingResponse="PassThrough"/>
    </system.webServer>
</configuration>

答案 1 :(得分:0)

当我遇到这个帮助我的问题时

<staticContent>
    <remove fileExtension=".svg" />
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />

    <remove fileExtension=".woff" />
    <mimeMap fileExtension=".woff" mimeType="application/application/font-woff" />

    <remove fileExtension=".ttf" />
    <mimeMap fileExtension=".ttf" mimeType="application/x-font-truetype" />

    <remove fileExtension=".otf" />
    <mimeMap fileExtension=".otf" mimeType="application/x-font-opentype" />
</staticContent>

因此,在声明mimeMap之前,必须确保默认情况下没有注册mimeType,这就是为什么你可以删除mimeType然后注册它。