IIS 7 gibt HTTP 200 auf der benutzerdefinierten 404-Fehlerseite zurück

7

Ich habe erfolgreich benutzerdefinierte statische Fehlerseiten für IIS7 eingerichtet. IIS7 arbeitet derzeit als Gateway zu einer Java-Tomcat-Anwendung. Das Problem ist, dass die 404-Fehlerseite beim Bereitstellen mit einem HTTP 200-Statuscode-Header bereitgestellt wird. Ich möchte IIS so konfigurieren, dass weiterhin ein HTTP 404 gesendet wird. Die Fehlerseite ist als statische Seite im Webroot vorhanden.

Dies ist der Hauptteil meiner web.config:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="HTTP to HTTPS Redirect" enabled="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Found" />
            </rule>
            <rule name="Reverse Proxy" stopProcessing="true">
                <match url="(.*)" />
                <action type="Rewrite" url="http://localhost:8080/{R:1}" />
                <conditions>
                    <add input="{R:1}" pattern="error/*." negate="true" />
                </conditions>
            </rule>
        </rules>
    </rewrite>
    <httpErrors errorMode="Custom" existingResponse="Auto">
        <remove statusCode="404" subStatusCode="-1" />
        <error statusCode="404" prefixLanguageFilePath="" path="/error/404.htm" responseMode="ExecuteURL" />
    </httpErrors>
</system.webServer>
Ben Doerr
quelle
Tritt der Fehler beim Zugriff auf die Seite unter site / error / 440.htm auf oder nur, wenn er umgeleitet wird, wenn ein Fehler auftritt?
Greg Askew
1
Beide geben einen Statuscode 200 zurück. Ich würde erwarten, dass ein Fehler / 404.htm einen 200 zurückgibt. Bedenken Sie jedoch, dass foobar.htm nicht existiert. Das Durchsuchen von foobar.htm würde den Fehler / 404.htm (was es tut) rendern und den Header-Statuscode auf 404 setzen (was es nicht tut).
Ben Doerr
@ GregAskew Keiner von beiden spricht mein Problem an. Beide benötigen die Anwendung hinter IIS, um den Statuscode zu melden. Dies sollte jeder HTTP-Server können. Dies ist viel wichtiger für 502- und 503-Statuscodes, bei denen die Anwendung hinter dem HTTP-Server nicht verfügbar ist.
Ben Doerr
Kurze Frage: warum responseMode="ExecuteURL"? Sie liefern eine statische Datei!
Mathias R. Jessen

Antworten:

4

Wechseln Sie zu "Verwenden". responseMode="File"Der Trick dabei besteht jedoch darin, relative Dateipfade zu verwenden, es sei denn, Sie entsperren oder setzen auf "true" system.webServer/httpErrors allowAbsolutePathsWhenDelegated.

Beispiel für einen web.config-Auszug:

<httpErrors>
    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" prefixLanguageFilePath="" path="error\404.htm" responseMode="File" />
</httpErrors>
Ben Doerr
quelle
Es funktioniert nicht bei mir. Es gibt immer noch 200 Fehlercode zurück
Mike Keskinov
Mike, das ist schade. Es ist einige Jahre her, seit ich auf dieses Problem gestoßen bin und seitdem nicht mehr wirklich IIS verwenden musste. Möglicherweise hat sich etwas geändert. Bitte fügen Sie Ihre Antwort hinzu, wenn Sie sie finden, damit ich die richtige Antwort aktualisieren kann.
Ben Doerr
Ben, wir verwenden nur die Aspx-Seite, auf der wir den Statuscode manuell festlegen. In einigen Fällen wäre es viel besser, eine statische HTML-Datei zu verwenden, aber leider haben wir keine gute Lösung gefunden :(
Mike Keskinov