Làm thế nào để một mô-đun có thể phát hiện khi Drupal xuất ra trang "truy cập bị từ chối"?
Tôi biết làm thế nào với Drupal 6; Tôi cần biết làm thế nào để làm điều đó với Drupal 7.
Làm thế nào để một mô-đun có thể phát hiện khi Drupal xuất ra trang "truy cập bị từ chối"?
Tôi biết làm thế nào với Drupal 6; Tôi cần biết làm thế nào để làm điều đó với Drupal 7.
Câu trả lời:
Bạn có thể đặt trang nào được hiển thị khi xảy ra lỗi 403 & 404 (quản trị viên / cài đặt / báo cáo lỗi).
Tôi đoán bạn có thể thêm một trang mới vào hook_menu()
, sau đó đặt trang này làm cuộc gọi lại lỗi 403. Khi gọi lại menu tùy chỉnh của bạn, bạn biết rằng bạn đang xuất trang "truy cập bị từ chối"!
Tôi làm điều này trong Boost 7.x. Nó không đẹp, nhưng nó hoàn thành công việc.
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;
// …
}
// …
}
// …
}
Trong Drupal 7, hàm trả về các tiêu đề HTTP đã được đặt là drupal_get_http_header () , yêu cầu tên tiêu đề HTTP làm tham số. Nhìn vào mã Authorize_access_denied_page () và mã drupal_fast_404 () cho thấy rõ giá trị nào sẽ truyền cho hàm đó.
// 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;
}
Khi tiêu đề "Trạng thái" bắt đầu bằng 403 , thì Drupal xuất ra trang bị từ chối truy cập.
Hãy chắc chắn rằng cuộc gọi drupal_get_http_header('Status')
sẽ xảy ra muộn. Gọi trong thời gian hook_init()
quá sớm, nhưng gọi nó trong hook_page_alter()
(hoặc bất kỳ hook tiền xử lý chủ đề nào) sẽ có thông tin tiêu đề được cập nhật.
drupal_get_http_header('Status')
trả về NULL
.
Mô-đun của bạn có thể chặn giá trị của " Default 403 (access denied) page
" được sửa đổi bởi trang " Administer > Site configuration > Error reporting
":
Trong hook_enable
, sử dụng variable_get
/ variable_set
, sao chép giá trị hiện có vào một biến thứ cấp và thay thế biến đó bằng đường dẫn của riêng bạn (mà bạn đã đăng ký sử dụng hook_menu
).
thay đổi biểu mẫu "Báo cáo lỗi" bằng cách sử dụng hook_form_FORM_ID_alter
để đọc từ / ghi vào biến phụ
Nếu bạn muốn hoàn toàn vô hình với người dùng, hãy gọi lại trang của bạn để có thể gọi drupal_goto( the_value_of_the_secondary_variable )
.
Trong hook_disable
, khôi phục giá trị từ biến thứ cấp.
Và đó là, mô-đun của bạn được thông báo một cách rõ ràng (và vô hình với người dùng) khi "Truy cập bị từ chối" được kích hoạt.
Chắc chắn bạn có thể sử dụng get_headers()
chức năng của PHP ?
Phần tử đầu tiên trong mảng được trả về sẽ là mã phản hồi. Nếu nó chứa '403' thì Drupal trả về trang "truy cập bị từ chối".
Tôi không chắc nơi tốt nhất để gọi nó sẽ là. Có lẽ hook_exit()
, tùy thuộc vào nhu cầu của bạn:
http://api.drupal.org/api/drupal/developer--hooks--core.php/feft/hook_exit/6
Đây là cách đơn giản nhất để phát hiện Truy cập bị từ chối (403) và Không tìm thấy trang (404) trong 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']);
Bạn có thể sử dụng mô-đun Panels cho việc này.
Mô-đun Panels cho phép người quản trị trang tạo bố cục tùy chỉnh cho nhiều mục đích sử dụng. Về cốt lõi, nó là trình quản lý nội dung kéo và thả cho phép bạn thiết kế trực quan bố cục và đặt nội dung trong bố cục đó. Tích hợp với các hệ thống khác cho phép bạn tạo các nút sử dụng cái này, trang đích sử dụng cái này và thậm chí ghi đè các trang hệ thống như phân loại và trang nút để bạn có thể tùy chỉnh bố cục trang web của mình với các quyền hạn rất nhỏ.