Làm thế nào một mô-đun có thể phát hiện khi đầu ra bị từ chối của trang bị từ chối?


16

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:


13

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"!


Đây không phải là một giải pháp tốt cho tôi vì điều này đang thay đổi đầu ra, không chỉ phát hiện 403.
Fabien Quatravaux

12

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;

      // …

    }
    // …
  }
  // …   
}

Đây là một hack lớn nhưng nó hoạt động: những gì bạn đang làm được gọi là không tặc. Bạn cắm mã của riêng bạn tại một điểm trước đó, và sau đó sao chép mã lõi với một sửa đổi tối thiểu.
Fabien Quatravaux

10

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 ()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.


Đây thực sự là một câu trả lời tốt. Tuy nhiên, chỉ cần lưu ý một điểm: có vẻ như chỉ hoạt động nếu trang không được lưu trong bộ nhớ cache. Nếu trang đã được truy cập trước đó, drupal_get_http_header('Status')trả về NULL.
Fabien Quatravaux

4

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":

  1. 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).

  2. 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ụ

  3. 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 ).

  4. 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.


2

Chắc chắn bạn có thể sử dụng get_headers()chức năng của PHP ?

http://php.net/manual/en/feft.get-headers.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


2

Đâ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']);

-2

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ỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.