如何从模块/模板检查当前页面是否是404错误?


Answers:


33

在Drupal 7中,您可以使用drupal_get_http_header()

在template.php文件中,使用此代码。

$status = drupal_get_http_header("status");
if ($status === '404 Not Found'){
  // Do something.
}

在Drupal 8中,可以在挂钩中使用以下代码。

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}

此代码在template.php中具有什么功能?
乔丹·马格努森

1
您可以将此代码放入template_preprocess_page(&$ variables)
fzmaster 2012年

这也可以在hook_exit()中实现
sheldonkreger 2014年

如果您要处理403,可以使用:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein 2015年

2
注意:system.404如果您在“ 配置”>“系统”>“基本站点设置”中将节点页面指定为404页面,则基于路由的Drupal 8解决方案将不起作用。请参阅@Gervase的答案,以获取在您指定或未指定自定义404页面时可以使用的解决方案。
JamesWilson

11

Drupal 8.2.x:

不幸的是,drupal_get_http_header(“ status”)不再起作用。

尝试:

$status = \Drupal::requestStack()->getCurrentRequest()->attributes->get('exception');
if ($status && $status->getStatusCode() == 404){

}

这里有一个讨论:https : //www.drupal.org/node/1969270


1
这就是我想要的! <3
JamesWilson

1
但是请小心-在那里投射的对象可能没有getStatusCode功能。
fritzmg

这结束了我无尽的搜索和尝试。
usmanjutt84

4

这是在Drupal 7中检测访问被拒绝(403)和页面未找到(404)的最简单方法。

// get the menu router item for the current page
$router_item = menu_get_item();

// if there is no router item, this page is not found
$is_page_not_found_404 = empty($router_item);

// if 'access' is empty for the router item, access is denied
$is_access_denied_403 = empty($router_item['access']);

$router_item如果将site_404变量设置为节点路径,则不会为空,因此需要进行其他检查。
gapple

menu_get_item,每页的通话费用昂贵吗?
凯文(Kevin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.