为错误403.14目录访问拒绝创建自定义错误

时间:2013-05-31 13:04:45

标签: c# asp.net

这是我在这里发表的第一篇文章,我在这里和网上的许多其他论坛都搜索了这个问题的解决方案,但没有成功。

我正在尝试为目录访问被拒绝错误403.14创建自定义错误,以防有人试图在网站上加载“_assests”目录。我知道我可以通过在我希望发生这种情况的每个目录中添加一个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.

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

web.config中添加了以下内容,到目前为止似乎有效。不知道原因,但如果我没有明确告诉 403 错误重定向到自定义403.aspx页面,而不是GenericError.aspx页面,我会得到 500 错误。但是,如果我将 404 错误重定向到我的自定义404.aspx页面,则GenericError.aspx代码会写入到位,而不是预期的,并且您似乎永远不会重定向到实际404.aspx页面(请参阅web.config的评论部分)。奇异。

<强> CODE:

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>

GenericError.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();
    }

}

<强>来源:

CustomError in web.config

答案 1 :(得分: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帖子:

Custom Error Handling in web.config / Global.asax not handling non-existant directory

Custom error handling Asp.Net