it-swarm-vi.com

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

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 cách thực hiện với Drupal 6; Tôi cần biết cách thực hiện với Drupal 7.

16
kiamlaluno

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 Authorize_access_denied_page ()drupal_fast_404 () code làm 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 , sau đó Drupal xuất ra một trang bị từ chối truy cập.

Đảm bảo cuộc gọi đến drupal_get_http_header('Status') xảy ra muộn. Gọi trong khi hook_init() là 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.

10
kiamlaluno

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

13
opi

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;

      // …

    }
    // …
  }
  // …   
}
12
mikeytown2

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 tại vào một biến phụ và thay thế biến bằng chính biến của bạn đường dẫn (mà bạn đã đăng ký bằ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, cuộc 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 phụ.


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.

4
wildpeaks

Chắc chắn bạn có thể sử dụng hàm get_headers() 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ó thể 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
Greg

Đâ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
Lindsay