模块如何检测何时输出“拒绝访问”页面?


16

模块如何检测Drupal何时输出“拒绝访问”页面?
我知道如何用Drupal 6做到这一点;我需要知道如何使用Drupal 7。

Answers:


13

您可以设置在发生403和404错误时显示哪些页面(管理员/设置/错误报告)。

我想您可以在中添加新页面hook_menu(),然后将此页面设置为403错误回调。当您的自定义菜单回调被点击时,您知道您正在输出“拒绝访问”页面!


这不是一个很好的解决方案对我来说,这是改变输出,不仅检测403
法比安斯基Quatravaux

12

我在Boost 7.x中执行此操作。它虽然不漂亮,但确实可以完成工作。

function boost_page_delivery_callback_alter(&$callback, $set = FALSE) {
  if ($callback == 'drupal_deliver_html_page') {
    $callback = 'boost_deliver_html_page';
  }
}

function boost_deliver_html_page($page_callback_result) {
  global $_boost;

  // Menu status constants are integers; page content is a string or array.
  if (is_int($page_callback_result)) {
    // @todo: Break these up into separate functions?
    switch ($page_callback_result) {

      // …

      case MENU_ACCESS_DENIED:
        // 403 page.
        $_boost['menu_item']['status'] = 403;
        break;

      // …

    }
    // …
  }
  // …   
}

这是一个很大的黑客,但确实有效:您正在做的事情称为劫持。您可以在较早的时候插入自己的代码,然后以最小的修改重现核心代码。
法比恩·夸特拉沃

10

在Drupal 7中,返回已设置的HTTP标头的函数是drupal_get_http_header(),它需要HTTP标头名称作为参数。查看authorize_access_denied_pa​​ge()drupal_fast_404()代码可以清楚地将哪些值传递给该函数。

  // authorize_access_denied_page()
  drupal_add_http_header('Status', '403 Forbidden');
  watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);
  drupal_set_title('Access denied');
  return t('You are not allowed to access this page.');
// drupal_fast_404()
if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {
  drupal_add_http_header('Status', '404 Not Found');
  $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
  // Replace @path in the variable with the page path.
  print strtr($fast_404_html, array('@path' => check_plain(request_uri())));
  exit;
}

当“ Status”标头以403开头时,Drupal输出访问拒绝页面。

确保呼叫drupal_get_http_header('Status')发生晚。在期间调用hook_init()还为时过早,但是在期间hook_page_alter()(或任何主题预处理钩子)调用将具有更新的标头信息。


这确实是一个很好的答案。但是,仅需注意一点:它似乎仅在未缓存页面时才有效。如果以前已经访问过该页面,则drupal_get_http_header('Status')返回NULL
Fabien Quatravaux

4

您的模块可以截获“ Default 403 (access denied) page” 的值,该值由页面“ Administer > Site configuration > Error reporting” 修改:

  1. hook_enable使用variable_get/ variable_set现有的值复制到一个辅助变量,并通过自己的替代变量路径(你使用注册hook_menu)。

  2. 更改“错误报告”表格hook_form_FORM_ID_alter用于读取/写入辅助变量

  3. 如果您希望对用户完全不可见,则可以调用的页面回调drupal_goto( the_value_of_the_secondary_variable )

  4. 在中hook_disable,从辅助变量恢复值


就是这样,当触发“拒绝访问”时,您的模块将以一种干净的方式(对于用户不可见)得到通知。



2

这是在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']);

-2

您可以为此使用面板模块。

面板模块允许站点管理员创建自定义的布局以用于多种用途。它的核心是拖放内容管理器,可让您直观地设计布局并将内容放置在该布局中。与其他系统的集成使您可以创建使用此功能的节点,使用此功能的登录页面,甚至覆盖系统页面(例如分类法和节点页面),以便您可以使用非常精细的权限自定义网站的布局。

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.