"액세스 거부"페이지가 출력되는시기를 모듈이 어떻게 감지 할 수 있습니까?


16

Drupal이 "액세스 거부"페이지를 출력 할 때 모듈이 어떻게 감지 할 수 있습니까?
Drupal 6을 사용하는 방법을 알고 있습니다. Drupal 7을 사용하는 방법을 알아야합니다.

답변:


13

403 및 404 오류가 발생할 때 표시되는 페이지를 설정할 수 있습니다 (관리자 / 설정 / 오류보고).

에 새 페이지를 추가 한 hook_menu()다음이 페이지를 403 오류 콜백으로 설정할 수 있습니다 . 사용자 정의 메뉴 콜백이 발생하면 "액세스 거부"페이지가 출력되고있는 것입니다!


이것은 403을 감지 할뿐 아니라 출력을 변경하기 때문에 나에게 좋은 해결책이 아닙니다.
Fabien Quatravaux

12

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;

      // …

    }
    // …
  }
  // …   
}

이것은 큰 해킹이지만 작동합니다 : 당신이하고있는 일은 하이재킹입니다. 초기에 자신의 코드를 연결 한 다음 최소한의 수정으로 핵심 코드를 재현합니다.
Fabien Quatravaux

10

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;
}

"Status"헤더가 403으로 시작 하면 Drupal은 액세스 거부 페이지를 출력합니다.

전화 drupal_get_http_header('Status')가 늦게 발생 하는지 확인하십시오 . 호출하는 시간 hook_init()이 너무 빠르지 만 호출하는 동안 hook_page_alter()(또는 테마 사전 프로세스 후크) 호출하면 헤더 정보가 업데이트됩니다.


이것은 정말 좋은 대답입니다. 그러나 한 가지 주목할 점은 페이지가 캐시되지 않은 경우에만 작동하는 것 같습니다. 이전에 페이지에 액세스 한 drupal_get_http_header('Status')경우을 반환합니다 NULL.
Fabien Quatravaux

4

모듈이 " Default 403 (access denied) page" 값을 가로 채서 " "페이지에서 수정합니다 Administer > Site configuration > Error reporting:

  1. 에서 hook_enable사용 variable_get/ variable_set, 기존의 값을 복사 보조 변수와 자신에 의해 변수를 대체 (사용 등록하는 경로 hook_menu).

  2. hook_form_FORM_ID_alter보조 변수를 읽고 쓰는 데 사용 하는 "오류보고"양식변경합니다.

  3. 사용자가 완전히 보이지 않게하려면 페이지 콜백에서을 (를) 호출 할 수 drupal_goto( the_value_of_the_secondary_variable )있습니다.

  4. 이어 hook_disable, 값 복원 보조 변수에서를.


그리고 "액세스 거부"가 트리거 되면 모듈은 깔끔한 방식으로 (그리고 사용자에게 보이지 않는) 알림 받습니다 .


2

확실히 당신은 PHP의 get_headers()기능을 사용할 수 있습니까?

http://php.net/manual/en/function.get-headers.php

반환 된 배열의 첫 번째 요소는 응답 코드입니다. '403'이 포함 된 경우 Drupal은 "액세스 거부"페이지를 리턴했습니다.

전화하기 가장 좋은 곳이 어디인지 잘 모르겠습니다. 아마 hook_exit()당신의 필요에 따라 :

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6


2

이는 Drupal 7에서 액세스 거부 (403) 및 페이지를 찾을 수 없음 (404)을 감지하는 가장 간단한 방법입니다.

// 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

이를 위해 패널 모듈을 사용할 수 있습니다 .

사이트 관리자는 패널 모듈을 사용하여 여러 용도로 사용자 정의 된 레이아웃을 만들 수 있습니다. 핵심은 레이아웃을 시각적으로 디자인하고 해당 레이아웃 내에 컨텐츠를 배치 할 수있는 끌어서 놓기 컨텐츠 관리자입니다. 다른 시스템과 통합하면이를 사용하는 노드,이 페이지를 사용하는 랜딩 페이지를 만들 수 있으며 분류 체계 및 노드 페이지와 같은 시스템 페이지를 재정의 할 수 있으므로 매우 세밀한 권한으로 사이트 레이아웃을 사용자 지정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.