模块如何检测Drupal何时输出“拒绝访问”页面?
我知道如何用Drupal 6做到这一点;我需要知道如何使用Drupal 7。
模块如何检测Drupal何时输出“拒绝访问”页面?
我知道如何用Drupal 6做到这一点;我需要知道如何使用Drupal 7。
Answers:
我在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;
// …
}
// …
}
// …
}
在Drupal 7中,返回已设置的HTTP标头的函数是drupal_get_http_header(),它需要HTTP标头名称作为参数。查看authorize_access_denied_page()和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
。
您的模块可以截获“ Default 403 (access denied) page
” 的值,该值由页面“ Administer > Site configuration > Error reporting
” 修改:
在hook_enable
使用variable_get
/ variable_set
,现有的值复制到一个辅助变量,并通过自己的替代变量路径(你使用注册hook_menu
)。
更改“错误报告”表格,hook_form_FORM_ID_alter
用于读取/写入辅助变量
如果您希望对用户完全不可见,则可以调用的页面回调drupal_goto( the_value_of_the_secondary_variable )
。
在中hook_disable
,从辅助变量恢复值。
就是这样,当触发“拒绝访问”时,您的模块将以一种干净的方式(对于用户不可见)得到通知。
当然可以使用PHP的get_headers()
功能吗?
返回的数组中的第一个元素将是响应代码。如果包含“ 403”,则Drupal返回“访问被拒绝”页面。
我不确定最好的通话地点在哪里。可能hook_exit()
取决于您的需求:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6
这是在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']);
您可以为此使用面板模块。
面板模块允许站点管理员创建自定义的布局以用于多种用途。它的核心是拖放内容管理器,可让您直观地设计布局并将内容放置在该布局中。与其他系统的集成使您可以创建使用此功能的节点,使用此功能的登录页面,甚至覆盖系统页面(例如分类法和节点页面),以便您可以使用非常精细的权限自定义网站的布局。