2017-06-01 4 views
1

Ich baue eine Mischung aus statischen Seiten und Knoten-Website mit Azure WebApps und ich hätte gerne eine benutzerdefinierte 404-Seite und ich kann es einfach nicht funktionieren. Die meisten der Website ist statisch, aber ich habe ein paar Routen, die Server-Code erfordern. Mein web.config sieht wie folgt aus:Benutzerdefinierte statische Fehlerseite mit Knoten und Azure WebApp

<?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> 

Ich habe versucht, mit verschiedenen Variationen von httpErrors, Wert der path, responseMode, existingResponse="PassThrough" entfernen, etc., aber ich kann einfach nicht damit es funktioniert.

Zugriff direkt /404.html funktioniert. Der Server gibt beim Zugriff auf eine URL, die nicht existiert, einen 404-Fehler zurück, nur nicht den benutzerdefinierten, den ich möchte. Was mache ich falsch?

Ich weiß, ich könnte alles von Knotenland aus behandeln, aber ich möchte das möglichst vermeiden.

Antwort

2

Ich bin in der Lage, die benutzerdefinierte 404.html Seite mit der folgenden web.config Datei und eine expressjs App auf Azure App Service zu bekommen. Sie können es als Referenz nehmen.

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> 

Ordnerstruktur

enter image description here

Wenn ich besuchen jede Datei, die ich angezeigt nicht vorhanden bekam 404-Seite.

enter image description here

+0

Ich weiß nicht, was ich falsch mache, aber das funktionierte. Danke vielmals! –

Verwandte Themen