【问题标题】:Serving Up Pages for HTTP Status Codes为 HTTP 状态代码提供页面
【发布时间】:2019-10-25 23:11:51
【问题描述】:

我正在尝试为 ASP.NET 4.5.2 Web 窗体项目设置 500 和 404 页面。当不存在的页面是 .ASPX 页面时,我让 404 工作。 - 我编写了代码来提供自定义 NotFound.aspx 页面作为响应。

当我使用 Web.config 为不存在的 HTML 页面提供 404.html 页面时,出现了我的问题。我的 404.html 页面位于根文件夹中。如果我使用根文件夹中不存在的 HTML 页面对此进行测试,则 404.html 会正确呈现。但是,如果我在不存在的子文件夹中使用不存在的 HTML 页面对其进行测试,则会提供 404.html,但 CSS/JS 路径不再正确?就像它正在将 CSS/JS 路径视为与我在测试中指定的不存在的子文件夹相关?

Global.asax.cs:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    if (ex != null && ex is HttpUnhandledException)
    {
        Server.ClearError();
        Server.Transfer("~/Error.aspx", true);
    }

    if (ex != null)
    { 
        var httpException = ex as HttpException; 
        if (httpException.GetHttpCode() == 404)
        {
            Server.ClearError();
            Server.Transfer("~/NotFound.aspx", true); 
        }
    }
}

Web.config:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <error statusCode="404" path="404.html" responseMode="File" />
</httpErrors>

【问题讨论】:

    标签: asp.net webforms http-status-code-404


    【解决方案1】:

    对 CSS/JS 路径使用绝对 URL。例如,在您的404.html 中(bootstrap 和 jquery 只是示例):

    <link href="/Content/bootstrap.min.css" rel="stylesheet" />
    <script src="/Scripts/jquery-3.0.0.min.js"></script>
    <script src="/Scripts/bootstrap.min.js"></script>
    

    另一种设置是设置responseMode="Redirect":

    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error statusCode="404" path="/Errors/404.html" responseMode="Redirect" />
    </httpErrors>
    

    在此示例中,404.html 位于文件夹 Errors 中,并且 URL 可以是相对的:

    <link href="../Content/bootstrap.min.css" rel="stylesheet" />
    <script src="../Scripts/jquery-3.0.0.min.js"></script>
    <script src="../Scripts/bootstrap.min.js"></script>
    

    这将起作用,因为重定向 URL 不再与您请求的任何 URL 相关。

    【讨论】:

    • 不起作用...我们基本上只是在移动 404 页面。此外,第一个示例中的 URL 是相对的,而不是绝对的。
    • 这两个示例都在我的 VS 2017 ASP.NET 4.5.2 WebForns 项目中工作。以/ 开头的 URL 是绝对的。我不知道您使用的是什么 css/js 路径,但如果它们是相对的,那么这是您面临的正常行为。例如,如果您有引用 css/js 的 xslt 文件,也会发生同样的情况。
    • 以“/”开头的 URL 是相对路径。绝对路径总是以域名开头:coffeecup.com/help/articles/absolute-vs-relative-pathslinks 我已经设法解决了这个问题,稍后会更新帖子。感谢您的努力 dpant :)
    【解决方案2】:

    我能够解决它如下:

    <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="404" />
        <error statusCode="404" path="http://localhost/myproject/404.html"
            responseMode="File" />
    </httpErrors>
    

    关键的一点是路径必须是绝对的,这个版本才能工作。所以我的下一步是尝试以编程方式设置路径,以便在调试模式下它会转到我的本地,在发布模式下会转到生产 URL。我不想弄乱 Web.config 转换文件。

    如果有人有任何进一步的信息,请随时。

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多