web-dev-qa-db-de.com

So verhindern Sie, dass "aspxerrorpath" als Abfragezeichenfolge an benutzerdefinierte ASP.NET-Fehlerseiten übergeben wird

In meiner ASP.NET-Webanwendung habe ich benutzerdefinierte Fehlerseiten in meiner Datei web.config wie folgt definiert:

<customErrors mode="On" defaultRedirect="~/default.html">
     <error statusCode="404" redirect="~/PageNotFound.html" />
</customErrors>

Im Falle eines 404-Fehlers leitet meine Website auf die Seite default.html um, übergibt jedoch "aspxerrorpath" als Abfragezeichenfolgeparameter an die benutzerdefinierte Fehlerseite:

http://www.example.com/default.html?aspxerrorpath=/somepathcausederror/badpage.aspx

Ich will dieses Verhalten nicht. Ich möchte die Weiterleitungs-URL einfach lesen:

http://www.example.com/default.html

Gibt es einen Weg, dies zu erreichen? 

36
DSharper

Mein erster Gedanke wäre, einen HttpHandler zu erstellen, der URLs mit aspxerrorpath darin fängt und entfernt. Mit dem Umschreibungsmodul in IIS7 können Sie wahrscheinlich dasselbe tun.

3
Mikael Svenson

Wenn Sie bei der Angabe des Pfads Ihre eigene Abfragezeichenfolgenvariable angeben, wird .NET den "Aspxerrorpath" NICHT anpacken. Wer wusste?

Zum Beispiel:

<customErrors mode="On" defaultRedirect="errorpage.aspx?error=1" >

Dies wird den Trick tun . Ich musste dies zu einer Reihe von Apps hinzufügen, da URLScan für IIS ohnehin alles ablehnt, wo "aspxerrorpath" enthalten ist.

69
Matt J.

Fangen Sie in der Datei global.asax den Fehler 404 ab und leiten Sie zur Seite "Datei nicht gefunden" um. Ich brauchte den Aspxerrorpath nicht und es war ein Vergnügen für mich.

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404)
    {
        Response.Redirect("~/filenotfound.aspx");
    }
    else
    {
        // your global error handling here!
    }
}
10
Gareth Williams

Sie können einfach Ihre eigenen URL-Parameter an die Fehlerseite senden

<customErrors mode="On" defaultRedirect="~/default.html?404"> 
               <error statusCode="404" redirect="~/PageNotFound.html?404" /> 
</customErrors>
5
Shak18

Ich denke, Sie würden stattdessen das Ereignis Application_Error in Global.asax implementieren/verwenden und dort Ihre Verarbeitung/Weiterleitungen durchführen.

Vorausgesetzt, Sie rufen Server.ClearError in diesem Handler auf, glaube ich nicht, dass er die customErrors-Konfiguration überhaupt verwendet.

Ich benutze Javascript gerne

if (location.search != "") { window.location.href = "/404.html"; } 
1
Diogo Cid

Die beste Lösung (mehr eine Problemumgehung ..) , die ich seit jetzt implementiert habe, um zu verhindern, dass aspxerrorpath weiterhin die ASP.NET CustomErrors-Unterstützung verwendet, ist die Umleitung zu der Aktion, die die Fehlerbehandlung implementiert.

Dies sind einige Schritte meiner Lösung in einem ASP.NET MVC-Webanwendungskontext:

Aktivieren Sie zunächst das benutzerdefinierte Fehlermodul in web.config

<customErrors mode="On" defaultRedirect="~/error/500">
  <error statusCode="404" redirect="~/error/404"/>
</customErrors>

Definieren Sie dann eine Routing-Regel:

routes.MapRoute(
   name: "Error",
   url: "error/{errorType}/{aspxerrorpath}",
   defaults: new { controller = "Home", action = "Error", errorType = 500, aspxerrorpath = UrlParameter.Optional },
);

Implementieren Sie schließlich folgende Aktion (und zugehörige Ansichten ..):

public ActionResult Error(int errorType, string aspxerrorpath)
{
   if (!string.IsNullOrEmpty(aspxerrorpath)) {
      return RedirectToRoute("Error", errorType);
   }

   switch (errorType) {
      case 404:
           return View("~/Views/Shared/Errors/404.cshtml");

       case 500:
        default:
           return View("~/Views/Shared/Errors/500.cshtml");
    }
}
0
Ciro Corvino

Hinzufügen redirectMode="ResponseRewrite" im benutzerdefinierten Fehler wie folgt,

<customErrors mode="On" defaultRedirect="~/NotFound">
     <error statusCode="404" redirect="~/NotFound" redirectMode="ResponseRewrite"/>
</customErrors>

diese Lösung funktioniert bei mir.

0
Raji

Wenn Sie aspxerrorpath =/entfernen und die Antwortumleitung während der Fehlerbehandlung verwenden, wird eine Ausnahme angezeigt. 

0
Pawel