首页 > 解决方案 > DNN返回父页面而不是404页面,如何返回404?

问题描述

我们有一个正常的 DNN 安装(v09.00.02 366),我们使用站点设置下的“默认页面”设置了一个 404 页面。

当您浏览到不存在的页面时,DNN 会返回父页面的内容而不是返回 404 页面,这是一种奇怪的行为。

/parent/child => 返回 /parent 的内容

子页面不存在,因此它应该返回带有 HTTP 状态代码 404 的 404 页面。
我们如何更改行为以遵循所需的行为?

标签: dotnetnukedotnetnuke-9

解决方案


下面列出了未找到页面将在 DNN 中正确返回 404 错误的最常见实例:

  • 这是一个根级页面,不存在https://example.com/not-found
  • 该页面存在,但当前已被删除、禁用或受权限保护(和/或您没有适当的权限)

还有其他选择实例,但这是它的要点。这是因为 DNN 的动态特性。当一个模块被添加到一个页面时,DNN 不知道这个模块是否在动态创建它自己的 URL。

这方面的例子包括博客和新闻模块。非技术内容编辑需要能够创建新的博客文章或新闻项目,并且应该有自己的唯一 URL。

例子:

查看上面的示例,DNN 无法安全地重定向为 HTTP 404 错误,因为页面确实存在,但只能作为 URL,然后动态用于从页面上的模块加载自定义数据。

一种解决方案是创建您自己的 URL 提供程序,您可以基于 DNN 核心中的提供程序。

另一种解决方案是确保将独立页面(没有动态模块的页面)设置为指定规范的 URL。您可以在页面的相应设置中执行此操作。

有关发布时 URL 提供程序的更多信息,请参阅下面的博客文章。

https://www.dnnsoftware.com/community-blog/cid/154518/page-not-found-404-error-handling-in-dnn

附带说明一下,许多 URL 提供程序功能没有 UI 来控制它们。您可以通过运行以下查询来查看 URL 提供程序设置以查看设置是什么。

-- the highest-level settings
SELECT * FROM [dbo].[HostSettings] WHERE [SettingName] LIKE '%aum_%' ORDER BY [SettingName];
-- setttings for each website, overriding the host-level settings
SELECT * FROM [dbo].[PortalSettings] WHERE [SettingName] LIKE '%aum_%' ORDER BY [PortalId], [SettingName];

推荐阅读