4

这是我在这里的第一篇文章,我已经在这里和网络上的许多其他论坛上寻找解决这个问题的方法,但没有成功。

我正在尝试为目录访问被拒绝错误 403.14 创建一个自定义错误,例如有人试图在网站上加载“_assets”目录。我知道我可以通过将 default.aspx 页面添加到我希望发生这种情况的每个目录来解决问题,但想知道是否有类似于 web.config 文件中的标记的站点范围的解决方案

<configuration>
<system.web>
    <customErrors defaultRedirect="/Errors/GenericError.aspx" mode="RemoteOnly">
      <error statusCode="401"
         redirect="/Errors/401.aspx"/>
      <error statusCode="403"
         redirect="/Errors/403.aspx"/>
      <error statusCode="404"
         redirect="/Errors/404.aspx"/>
    <!-- 
      <error statusCode="403.14"
         redirect="/"/>
    -->
    </customErrors>
</system.web>
</configuration>

对 web.config 进行编码时出现错误,我无法使用其中包含小数的 statusCode,因为它不是数据类型 Int

我在 Server 2008 上有一个 IIS 7。

有任何想法吗?

4

2 回答 2

2

如果这听起来相当混乱,请提前道歉。很高兴澄清。

添加了以下内容,web.config到目前为止它似乎工作。不知道为什么,但如果我没有明确告诉403错误重定向到自定义403.aspx页面,而不是GenericError.aspx页面,我会收到500错误。但是,如果我将404错误重定向到我的自定义404.aspx页面,则GenericError.aspx代码是就地编写的,而不是预期的,并且您似乎永远不会重定向到实际404.aspx页面(请参阅 的注释部分web.config)。奇怪。

代码:

web.config 文件:

<system.webServer>
    <httpErrors existingResponse="Replace" errorMode="Custom">
        <remove statusCode="403"/>
        <remove statusCode="404"/>
        <error statusCode="403" path="/Errors/403.aspx" responseMode="Redirect"  />
<!-- <error statusCode="403" path="/Errors/GenericError.aspx" responseMode="Redirect"  /> -->
<!-- <error statusCode="404" path="/Errors/GenericError.aspx" responseMode="Redirect"  /> -->
<error statusCode="404" path="/Errors/404.aspx" responseMode="Redirect"  />
    </httpErrors>
</system.webServer>

通用错误.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{

    var ex = HttpContext.Current.Server.GetLastError();

    if (ex is HttpException)
    {
        var nex = ex as HttpException;
        //Label in the Main code displays the Error Code from the Error String
        this.customErrorMessageCode.Text += "Error Code" + " " + nex.GetHttpCode().ToString();
        //Label in the Main code displays the Error Message from the Error String
        this.customErrorMessageLabel.Text += ex.Message.ToString();
        //DIV ID in the Main code displays the entire error message
        this.customErrorMessage.Visible = true;
        switch (nex.GetHttpCode())
        {
            case 404:
                this.customErrorMessageCode.Text += " Page Not Found";
                this.customErrorMessageImage.Visible = true;
                // do somehting cool
                break;
            case 403:
                this.customErrorMessageCode.Text += " Forbidden Access";
                this.customErrorMessageImage.Visible = true;
                // do somehting cool
                break;
            case 500:
                this.customErrorMessageCode.Text += " Internal Error";
                this.customErrorMessageImage.Visible = true;
                // do somehting cool
                break;
            default:
                break;
        }
    }
    else {
        this.customErrorMessageLabel.Text += ex.Message + ex.GetType().ToString();
    }

}

资源:

web.config 中的自定义错误

于 2013-06-03T13:44:06.777 回答
1

也许您可以使用基于实际错误代码的重定向方法,使用Server.GetLastError().

Global.asax你将有这样的事情:

protected void Application_Error(object sender, EventArgs e)
{
    if (Context.IsCustomErrorEnabled) {
        ShowCustomErrorPage(Server.GetLastError());
    }
}

ShowCustomErrorPage然后会有一个 switch 语句读取 HTTP 代码并重定向到正确的错误页面。

更多来自源链接,但它可能过于特定于 MVC。由于您没有提到您使用 MVC,所以我不想假设并盲目地复制粘贴。

我对 MVC 不太熟悉,但这里的原则看起来可以根据您的情况进行调整。

来源:http ://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-custom-error-pages

编辑

找到了一些 StackOverflow 帖子也可以提供帮助:

web.config / Global.asax 中的自定义错误处理不处理不存在的目录

自定义错误处理 Asp.Net

于 2013-05-31T13:22:46.283 回答