it-swarm-ko.tech

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

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

16
kiamlaluno

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() (또는 테마 전처리 후크) 동안 호출하면 업데이트 된 헤더 정보가 있습니다.

10
kiamlaluno

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

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

13
opi

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;

      // …

    }
    // …
  }
  // …   
}
12
mikeytown2

모듈이 "Administer > Site configuration > Error reporting"페이지에 의해 수정 된 "Default 403 (access denied) page"값을 가로 챌 수 있습니다.

  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에서 보조 변수의 값 복원입니다.


"Access denied"가 트리거되면 모듈에 깨끗한 방식으로 (그리고 사용자에게 보이지 않는) 알림이 표시됩니다.

4
wildpeaks

확실히 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
Greg

이것은 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
Lindsay