โมดูลจะตรวจพบได้อย่างไรเมื่อหน้า“ ปฏิเสธการเข้าถึง” ถูกส่งออก?


16

เป็นไปได้อย่างไรที่โมดูลจะตรวจพบเมื่อ Drupal แสดงผลหน้า "การเข้าถึงถูกปฏิเสธ"
ฉันรู้วิธีที่จะทำกับ Drupal 6; ฉันจำเป็นต้องรู้วิธีการใช้ Drupal 7

คำตอบ:


13

คุณสามารถตั้งค่าว่าจะแสดงหน้าใดเมื่อข้อผิดพลาด 403 & 404 เกิดขึ้น (ผู้ดูแลระบบ / การตั้งค่า / การรายงานข้อผิดพลาด)

ฉันเดาว่าคุณสามารถเพิ่มหน้าใหม่ในของคุณhook_menu()จากนั้นตั้งค่าหน้านี้เป็นข้อผิดพลาดการโทรกลับ 403 เมื่อเมนูที่คุณติดต่อกลับถูกกำหนดเองคุณรู้ว่าคุณกำลังแสดงผลหน้า "ปฏิเสธการเข้าถึง"!


นี่ไม่ใช่ทางออกที่ดีสำหรับฉันเพราะนี่คือการเปลี่ยนผลลัพธ์ไม่เพียง แต่ตรวจจับ 403
Fabien 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;

      // …

    }
    // …
  }
  // …   
}

อันนี้เป็นแฮ็คใหญ่ แต่ใช้งานได้: สิ่งที่คุณกำลังทำอยู่เรียกว่าการหักหลัง คุณเสียบรหัสของคุณเองที่จุดก่อนหน้านี้แล้วสร้างรหัสหลักด้วยการปรับเปลี่ยนน้อยที่สุด
Fabien Quatravaux

10

ใน 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()(หรือ hook preprocess ของชุดรูปแบบ) จะมีข้อมูลส่วนหัวที่อัปเดต


อันนี้เป็นคำตอบที่ดีจริงๆ เพียงแค่จุดเดียวที่ควรทราบ: ดูเหมือนว่าจะทำงานเฉพาะในกรณีที่หน้าไม่แคช หากหน้าเว็บมีการเข้าอยู่แล้วก่อนที่ผลตอบแทนdrupal_get_http_header('Status') NULL
Fabien Quatravaux

4

โมดูลของคุณสามารถดักจับค่าของ " 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, เรียกคืนค่าจากตัวแปรรอง


และนั่นคือโมดูลของคุณจะได้รับแจ้งในทางที่สะอาด (และผู้ใช้มองไม่เห็น) เมื่อ "ทริกเกอร์ปฏิเสธการเข้าถึง" ถูกทริกเกอร์


2

แน่นอนคุณสามารถใช้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

นี่เป็นวิธีที่ง่ายที่สุดในการตรวจหาการเข้าถึงถูกปฏิเสธ (403) และ Page Not Found (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

คุณสามารถใช้โมดูลการติดตั้งสำหรับสิ่งนี้

โมดูลพาเนลอนุญาตให้ผู้ดูแลระบบไซต์สร้างโครงร่างที่กำหนดเองสำหรับการใช้งานหลายครั้ง ที่แกนกลางของมันคือตัวจัดการเนื้อหาแบบลากและวางที่ให้คุณออกแบบเลย์เอาต์และวางเนื้อหาภายในเลย์เอาต์นั้น การรวมเข้ากับระบบอื่น ๆ ช่วยให้คุณสร้างโหนดที่ใช้สิ่งนี้หน้า Landing Page ที่ใช้สิ่งนี้และแม้แต่แทนที่หน้าระบบเช่น taxonomy และหน้าโหนดเพื่อให้คุณสามารถปรับแต่งเค้าโครงของไซต์ของคุณด้วยสิทธิ์ที่ละเอียดมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.