モジュールは、「アクセス拒否」ページが出力されたことをどのように検出できますか?


16

モジュールは、Drupalが「アクセス拒否」ページを出力していることをどのように検出できますか?
Drupal 6でそれを行う方法を知っています。Drupal 7でそれを行う方法を知る必要があります。

回答:


13

403および404エラーが発生したときに表示されるページを設定できます(admin / settings / error-reporting)。

に新しいページを追加して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;
}

「ステータス」ヘッダーが403で始まる場合、Drupalはアクセス拒否ページを出力します。

への呼び出しdrupal_get_http_header('Status')が遅れることを確認してください。duringの呼び出しhook_init()は早すぎますが、呼び出し中hook_page_alter()(またはテーマのプリプロセスフック)にヘッダー情報が更新されます。


これは本当に良い答えです。ただし、注意すべき点が1つあります。ページがキャッシュされていない場合にのみ機能するようです。以前にページにアクセスしたことがある場合は、がdrupal_get_http_header('Status')返されますNULL
ファビアンクアトラヴォー

4

モジュールはDefault 403 (access denied) page、ページ " Administer > Site configuration > Error reporting" によって変更される" " の値をインターセプトできます。

  1. で/ hook_enableを使用して、既存の値をセカンダリ変数にコピーし、変数を独自のパス(を使用して登録したパス)に置き換えますvariable_getvariable_sethook_menu

  2. hook_form_FORM_ID_alter二次変数の読み取り/書き込みに使用する「エラー報告」フォーム変更する

  3. ユーザーにまったく見えないようにしたい場合は、へのページコールバックを呼び出しますdrupal_goto( the_value_of_the_secondary_variable )

  4. 値を復元し、二次変数から。hook_disable


それだけです。「アクセス拒否」がトリガーされると、モジュールはクリーンな方法で通知さます(そしてユーザーには見えません)。


2

確かにPHPのget_headers()機能を使用できますか?

http://php.net/manual/en/function.get-headers.php

返される配列の最初の要素は応答コードになります。「403」が含まれている場合、Drupalは「アクセス拒否」ページを返しました。

それを呼び出すのに最適な場所がどこになるかはわかりません。おそらくhook_exit()、あなたのニーズに応じて:

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6


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

これにはPanelsモジュールを使用できます。

Panelsモジュールを使用すると、サイト管理者は複数の用途向けにカスタマイズされたレイアウトを作成できます。その中心となるのは、レイアウトを視覚的に設計し、そのレイアウト内にコンテンツを配置できるドラッグアンドドロップコンテンツマネージャーです。他のシステムとの統合により、これを使用するノード、これを使用するランディングページを作成し、分類法やノードページなどのシステムページをオーバーライドすることもできるため、サイトのレイアウトを非常にきめ細かな権限でカスタマイズできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.