it-swarm.asia

كيف يمكن للوحدة النمطية اكتشاف وقت إخراج صفحة "تم رفض الوصول"؟

كيف يمكن للوحدة أن تكتشف متى Drupal يخرج صفحة "تم رفض الوصول"؟
أنا أعرف كيف أفعل ذلك مع Drupal 6 ؛ أحتاج إلى معرفة كيفية القيام بذلك مع Drupal 7.

16
kiamlaluno

في 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') يحدث متأخراً. يعد الاتصال أثناء hook_init() مبكرًا جدًا ، ولكن الاتصال به أثناء hook_page_alter() (أو أي ربط للمعالجة المسبقة للنسق) سيحتوي على معلومات الرأس المحدثة.

10
kiamlaluno

يمكنك تعيين الصفحات التي يتم عرضها عند حدوث أخطاء 403 و 404 (المشرف/الإعدادات/الإبلاغ عن الأخطاء).

أعتقد أنه يمكنك إضافة صفحة جديدة في hook_menu() ، ثم تعيين هذه الصفحة على أنها استدعاء خطأ 403. عندما يتم النقر على استدعاء القائمة المخصصة الخاصة بك ، فأنت تعلم أنك تقوم بإخراج صفحة "تم رفض الوصول"!

13
opi

أفعل ذلك في 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;

      // …

    }
    // …
  }
  // …   
}
12
mikeytown2

يمكن لوحدتك الاعتراض على قيمة "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 ، استعادة القيمة من المتغير الثانوي.


هذا كل شيء ، يتم إخطار وحدتك بطريقة نظيفة (وغير مرئية للمستخدم) عند تشغيل "تم رفض الوصول".

4
wildpeaks

بالتأكيد يمكنك استخدام وظيفة get_headers() في PHP؟

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
Greg

هذه هي أبسط طريقة للكشف عن رفض الوصول (403) وعدم العثور على الصفحة (404) في Drupal 7.

// 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
Lindsay