เป็นไปได้อย่างไรที่โมดูลจะตรวจพบเมื่อ Drupal แสดงผลหน้า "การเข้าถึงถูกปฏิเสธ"
ฉันรู้วิธีที่จะทำกับ Drupal 6; ฉันจำเป็นต้องรู้วิธีการใช้ Drupal 7
เป็นไปได้อย่างไรที่โมดูลจะตรวจพบเมื่อ Drupal แสดงผลหน้า "การเข้าถึงถูกปฏิเสธ"
ฉันรู้วิธีที่จะทำกับ Drupal 6; ฉันจำเป็นต้องรู้วิธีการใช้ Drupal 7
คำตอบ:
คุณสามารถตั้งค่าว่าจะแสดงหน้าใดเมื่อข้อผิดพลาด 403 & 404 เกิดขึ้น (ผู้ดูแลระบบ / การตั้งค่า / การรายงานข้อผิดพลาด)
ฉันเดาว่าคุณสามารถเพิ่มหน้าใหม่ในของคุณhook_menu()
จากนั้นตั้งค่าหน้านี้เป็นข้อผิดพลาดการโทรกลับ 403 เมื่อเมนูที่คุณติดต่อกลับถูกกำหนดเองคุณรู้ว่าคุณกำลังแสดงผลหน้า "ปฏิเสธการเข้าถึง"!
ฉันทำสิ่งนี้ใน 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')
เกิดขึ้นช้า การโทรในระหว่างhook_init()
นั้นเร็วเกินไป แต่การโทรในระหว่างhook_page_alter()
(หรือ hook preprocess ของชุดรูปแบบ) จะมีข้อมูลส่วนหัวที่อัปเดต
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
, เรียกคืนค่าจากตัวแปรรอง
และนั่นคือโมดูลของคุณจะได้รับแจ้งในทางที่สะอาด (และผู้ใช้มองไม่เห็น) เมื่อ "ทริกเกอร์ปฏิเสธการเข้าถึง" ถูกทริกเกอร์
แน่นอนคุณสามารถใช้get_headers()
ฟังก์ชั่นของ PHP ?
องค์ประกอบแรกในอาร์เรย์ที่ส่งคืนจะเป็นรหัสการตอบกลับ หากมันมี '403' ดังนั้น Drupal จะส่งคืนหน้า "การเข้าถึงถูกปฏิเสธ"
ฉันไม่แน่ใจว่าจะใช้สถานที่ที่ดีที่สุดที่ไหน อาจhook_exit()
ขึ้นอยู่กับความต้องการของคุณ:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6
นี่เป็นวิธีที่ง่ายที่สุดในการตรวจหาการเข้าถึงถูกปฏิเสธ (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']);
คุณสามารถใช้โมดูลการติดตั้งสำหรับสิ่งนี้
โมดูลพาเนลอนุญาตให้ผู้ดูแลระบบไซต์สร้างโครงร่างที่กำหนดเองสำหรับการใช้งานหลายครั้ง ที่แกนกลางของมันคือตัวจัดการเนื้อหาแบบลากและวางที่ให้คุณออกแบบเลย์เอาต์และวางเนื้อหาภายในเลย์เอาต์นั้น การรวมเข้ากับระบบอื่น ๆ ช่วยให้คุณสร้างโหนดที่ใช้สิ่งนี้หน้า Landing Page ที่ใช้สิ่งนี้และแม้แต่แทนที่หน้าระบบเช่น taxonomy และหน้าโหนดเพื่อให้คุณสามารถปรับแต่งเค้าโครงของไซต์ของคุณด้วยสิทธิ์ที่ละเอียดมาก