包含节点和Azure WebApp的自定义静态错误页面

时间:2017-06-01 21:39:13

标签: node.js web-config azure-web-sites s

我正在使用Azure WebApps构建静态页面和节点网站的混合,我想要一个自定义的404页面,但我无法使其工作。 大多数网站都是静态的,但我有几条需要服务器代码的路由。我的web.config看起来如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>      
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By"/>
                <add name="x-dns-prefetch-control" value="on"/>
            </customHeaders>
        </httpProtocol>     
        <handlers>      
            <add name="iisnode" path="src/server/index.js" verb="*" modules="iisnode"/>
        </handlers>
        <rewrite>
            <rules>
            <rule name="static">
                <match url="(?!dynamicroute).*$" ignoreCase="true"/>
                <action type="Rewrite" url="dist{REQUEST_URI}"/>
            </rule>
            <rule name="dynamic">
                <match url="(?:dynamicroute)(.*)$" ignoreCase="true"/>
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                </conditions>
                <action type="Rewrite" url="src/server/index.js"/>
            </rule>
            </rules>            
        </rewrite>
        <!-- Make sure error responses are left untouched -->
        <!--<httpErrors existingResponse="PassThrough"/>-->
        <httpErrors errorMode="Custom" defaultResponseMode="File" existingResponse="PassThrough">   
            <remove statusCode="404" subStatusCode="-1" />
            <error statusCode="404" path="~/404.html" responseMode="File" />
        </httpErrors>
    </system.webServer>
</configuration>

我尝试使用httpErrors的不同变体,pathresponseMode的值,删除existingResponse="PassThrough"等,但我无法使其正常工作。

直接访问/404.html有效。访问不存在的URL时,服务器返回404错误,而不是我想要的自定义URL。 我做错了什么?

我知道我可以处理来自nodeland的所有内容,但如果可能的话,我想避免这种情况。

1 个答案:

答案 0 :(得分:2)

我可以让自定义404.html页面在Azure App Service上使用以下web.config文件和expressjs应用。你可以把它作为参考。

<强> 的web.config

<?xml version="1.0" encoding="utf-8"?>

<configuration>
     <system.webServer>
          <!-- Visit http://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx for more information on WebSocket support -->
          <webSocket enabled="false" />
          <handlers>
               <!-- Indicates that the app.js file is a node.js site to be handled by the iisnode module -->
               <add name="iisnode" path="app.js" verb="*" modules="iisnode"/>
          </handlers>
          <rewrite>
               <rules>
                    <!-- Do not interfere with requests for node-inspector debugging -->
                    <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">                    
                        <match url="^app.js\/debug[\/]?" />
                    </rule>

                    <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
                    <rule name="StaticContent">
                         <action type="Rewrite" url="public{REQUEST_URI}"/>
                    </rule>

                    <!-- All other URLs are mapped to the node.js site entry point -->
                    <rule name="DynamicContent">
                         <conditions>
                              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                         </conditions>
                         <action type="Rewrite" url="app.js"/>
                    </rule>
               </rules>
          </rewrite>

          <!-- bin directory has no special meaning in node.js and apps can be placed in it -->
          <security>
               <requestFiltering>
                    <hiddenSegments>
                         <remove segment="bin"/>
                    </hiddenSegments>
               </requestFiltering>
          </security>

          <httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
              <remove statusCode="404" subStatusCode="-1" />
              <error statusCode="404" path="/public/404.html" responseMode="ExecuteURL" />
          </httpErrors>

          <iisnode watchedFiles="web.config;*.js" debuggingEnabled="false" />
     </system.webServer>
</configuration>

文件夹结构

enter image description here

当我访问任何不存在的文件时,我显示了404页面。

enter image description here