كيف يمكن للوحدة أن تكتشف متى Drupal يخرج صفحة "تم رفض الوصول"؟
أنا أعرف كيف أفعل ذلك مع Drupal 6 ؛ أحتاج إلى معرفة كيفية القيام بذلك مع Drupal 7.
في 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()
(أو أي ربط للمعالجة المسبقة للنسق) سيحتوي على معلومات الرأس المحدثة.
يمكنك تعيين الصفحات التي يتم عرضها عند حدوث أخطاء 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;
// …
}
// …
}
// …
}
يمكن لوحدتك الاعتراض على قيمة "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) وعدم العثور على الصفحة (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']);