현재 페이지가 모듈 / 템플릿에서 404 오류인지 확인하는 방법은 무엇입니까?


답변:


33

Drupal 7에서는을 사용할 수 있습니다 drupal_get_http_header().

template.php 파일에서이 코드를 사용하십시오.

$status = drupal_get_http_header("status");
if ($status === '404 Not Found'){
  // Do something.
}

Drupal 8에서는 다음 코드를 후크에 사용할 수 있습니다.

$route_name = \Drupal::request()->attributes->get('_route');
if ('system.404' === $route_name) {
  // Do something.
}

이 코드는 template.php에서 어떤 기능을 수행합니까?
Jordan Magnuson

1
이 코드 내부의 template_preprocess_page ($ 변수)를 배치 할 수 있습니다
fzmaster

이것은 또한 hook_exit ()에서 구현 될 수있다
sheldonkreger

403을 처리하려는 경우 다음을 사용할 수 있습니다.if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein

2
참고 : 구성> 시스템> 기본 사이트 설정system.404 에서 노드 페이지를 404 페이지로 지정한 경우 경로를 기반으로하는 Drupal 8 솔루션이 작동하지 않습니다 . 사용자 정의 404 페이지를 지정하거나 지정하지 않은 경우 작동하는 솔루션은 @Gervase '답변을 참조하십시오.
JamesWilson

11

드루팔 8.2.x :

불행하게도 drupal_get_http_header ( "status")는 더 이상 작동하지 않습니다.

시험:

$status = \Drupal::requestStack()->getCurrentRequest()->attributes->get('exception');
if ($status && $status->getStatusCode() == 404){

}

여기에 대한 토론이 있습니다 : https://www.drupal.org/node/1969270


1
이것은 내가 찾던 것입니다! <3
JamesWilson

1
조심하십시오-거기에 retruned 객체는 getStatusCode기능 이 없을 수 있습니다 .
fritzmg

끝없는 수색과 노력이 끝납니다.
usmanjutt84

4

이는 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']);

$router_itemsite_404변수가 노드 경로로 설정되어 있으면 비어 있지 않으므로 추가 검사가 필요합니다.
gapple

menu_get_item, 페이지 당 조금 비싼 통화 아니요?
케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.