Ответ 1
Моя первая мысль заключалась бы в создании HttpHandler, который ловит url с aspxerrorpath
в нем и разделяет его. Вероятно, вы могли бы сделать то же самое с модулем перезаписи в IIS7.
В моем веб-приложении 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
Есть ли способ достичь этого?
Моя первая мысль заключалась бы в создании HttpHandler, который ловит url с aspxerrorpath
в нем и разделяет его. Вероятно, вы могли бы сделать то же самое с модулем перезаписи в IIS7.
Если вы укажете свой собственный строковый переменный запроса при указании пути, то .NET не будет ссылаться на "aspxerrorpath". Кто знал?
Например:
<customErrors mode="On" defaultRedirect="errorpage.aspx?error=1" >
Это сделает трюк. Мне пришлось добавить это в кучу приложений, поскольку URLScan для IIS по умолчанию все равно отклоняет что-либо с "aspxerrorpath".
В 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!
}
}
Вы можете просто отправить свои собственные параметры url на страницу с ошибкой
<customErrors mode="On" defaultRedirect="~/default.html?404">
<error statusCode="404" redirect="~/PageNotFound.html?404" />
</customErrors>
Я думаю, что вы вместо этого внедрили/использовали событие Application_Error в Global.asax и выполняли там свою обработку/переадресацию.
Предоставляя вам вызов Server.ClearError в этом обработчике, я не думаю, что он вообще будет использовать конфигурацию customErrors.
Я использую javascript как
if (location.search != "") { window.location.href = "/404.html"; }
Если вы удалите aspxerrorpath =/и используете перенаправление ответа при обработке ошибок, вы получите исключение, будет цикл перенаправления.
Лучшее решение (больше обходного пути..), которое я реализовал с тех пор, чтобы предотвратить проблему 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");
}
}
Добавьте redirectMode="ResponseRewrite"
в пользовательскую ошибку, как это,
<customErrors mode="On" defaultRedirect="~/NotFound">
<error statusCode="404" redirect="~/NotFound" redirectMode="ResponseRewrite"/>
</customErrors>
это решение работает для меня.