回答:
これは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;
}
「ステータス」ヘッダーが403で始まる場合、Drupalはアクセス拒否ページを出力します。
への呼び出しdrupal_get_http_header('Status')
が遅れることを確認してください。duringの呼び出し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']);