Подтвердить что ты не робот

Как предотвратить передачу "aspxerrorpath" в качестве строки запроса на страницы пользовательских ошибок ASP.NET

В моем веб-приложении ASP.NET я определил пользовательские страницы ошибок в файле web.config следующим образом:

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

В случае ошибки 404 мой сайт перенаправляется на страницу default.html, но передает "aspxerrorpath" в качестве параметра строки запроса на страницу пользовательской ошибки следующим образом:

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

Я не хочу этого поведения. Я хочу, чтобы URL-адрес перенаправления просто читался:

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

Есть ли способ достичь этого?

4b9b3361

Ответ 1

Моя первая мысль заключалась бы в создании HttpHandler, который ловит url с aspxerrorpath в нем и разделяет его. Вероятно, вы могли бы сделать то же самое с модулем перезаписи в IIS7.

Ответ 2

Если вы укажете свой собственный строковый переменный запроса при указании пути, то .NET не будет ссылаться на "aspxerrorpath". Кто знал?

Например:

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

Это сделает трюк. Мне пришлось добавить это в кучу приложений, поскольку URLScan для IIS по умолчанию все равно отклоняет что-либо с "aspxerrorpath".

Ответ 3

В global.asax уловить ошибку 404 и перенаправить на страницу, не найденную в файле. Я не нуждался в aspxerrorpath, и это сработало для меня.

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!
    }
}

Ответ 4

Вы можете просто отправить свои собственные параметры url на страницу с ошибкой

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

Ответ 5

Я думаю, что вы вместо этого внедрили/использовали событие Application_Error в Global.asax и выполняли там свою обработку/переадресацию.

Предоставляя вам вызов Server.ClearError в этом обработчике, я не думаю, что он вообще будет использовать конфигурацию customErrors.

Ответ 6

Я использую javascript как

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

Ответ 7

Если вы удалите aspxerrorpath =/и используете перенаправление ответа при обработке ошибок, вы получите исключение, будет цикл перенаправления.

Ответ 8

Лучшее решение (больше обходного пути..), которое я реализовал с тех пор, чтобы предотвратить проблему aspxerrorpath продолжающую использовать поддержку ASP.NET CustomErrors, - это перенаправление на действие, которое реализует обработку ошибок.

Вот некоторые шаги моего решения в контексте веб-приложения ASP.NET MVC:

Сначала включите модуль пользовательских ошибок в web.config

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

Затем определите правило маршрутизации:

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

Наконец, выполните следующее действие (и связанные представления..):

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");
    }
}

Ответ 9

Добавьте redirectMode="ResponseRewrite" в пользовательскую ошибку, как это,

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

это решение работает для меня.