「アクセスが拒否されました」ページが出力されたとき、モジュールはどのようにして検出できますか?
-
16-10-2019 - |
質問
Drupal が「アクセス拒否」ページを出力していることをモジュールはどのようにして検出できるのでしょうか?
私は Drupal 6 でそれを行う方法を知っています。Drupal 7 でそれを行う方法を知る必要があります。
解決 3
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()
(またはテーマの前処理フック) には更新されたヘッダー情報が含まれます。
他のヒント
403および404エラーが発生したときに表示されるページを設定できます(管理/設定/エラーレポート)。
私はあなたがあなたに新しいページを追加できると思います hook_menu()
, 次に、このページを403エラーコールバックとして設定します。カスタムメニューのコールバックがヒットすると、「アクセス拒否」ページを出力していることがわかります!
私はこれをブースト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;
// …
}
// …
}
// …
}
あなたのモジュールは、」の価値を傍受することができます」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)とPage Not Notが見つかっていない(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']);
使用できます パネル これのモジュール。
パネルモジュールを使用すると、サイト管理者は複数の用途向けにカスタマイズされたレイアウトを作成できます。そのコアでは、レイアウトを視覚的に設計し、そのレイアウト内にコンテンツを配置できるドラッグアンドドロップコンテンツマネージャーです。他のシステムとの統合を使用すると、これを使用するノード、これを使用するランディングページ、さらには分類法やノードページなどのシステムページをオーバーライドすることで、非常に細かい粒状の権限でサイトのレイアウトをカスタマイズできます。