Làm cách nào để kiểm tra xem trang hiện tại có phải là lỗi 404 từ mô-đun / mẫu không?


Câu trả lời:


33

Trong Drupal 7, bạn có thể sử dụng drupal_get_http_header().

Trong tệp template.php, sử dụng mã này.

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

Trong Drupal 8, bạn có thể sử dụng đoạn mã sau trong một hook.

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

Mã này đi vào chức năng nào, trong template.php?
Jordan Magnuson

1
Bạn có thể đặt mã này bên trong template_pre
process_page

Điều này cũng có thể được thực hiện trong hook_exit ()
sheldonkreger

Nếu bạn đang tìm cách xử lý 403, bạn có thể sử dụng:if ($status == '403 Forbidden') { /* ... do stuff ... */ }
tyler.frankenstein

2
Lưu ý: giải pháp cho Drupal 8 dựa trên system.404tuyến không hoạt động nếu bạn đã chỉ định một trang nút là trang 404 của mình trong Cấu hình> Hệ thống> Cài đặt trang cơ bản . Xem câu trả lời của @Gervase 'để biết giải pháp hoạt động khi bạn có hoặc không có trang 404 tùy chỉnh được chỉ định.
JamesWilson

11

Drupal 8.2.x:

Thật không may, drupal_get_http_header ("status") không hoạt động nữa.

Thử:

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

}

Có một cuộc thảo luận về điều này ở đây: https://www.drupal.org/node/1969270


1
Đây chỉ là những gì tôi đang tìm kiếm! <3
JamesWilson

1
Mặc dù cẩn thận - đối tượng được truy xuất ở đó có thể không có getStatusCodechức năng.
fritzmg

Nó kết thúc cuộc tìm kiếm và cố gắng vô tận của tôi.
usmanjutt84

4

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

$router_itemsẽ không trống nếu site_404biến được đặt thành đường dẫn nút, do đó sẽ cần kiểm tra bổ sung.
gapple

menu_get_item, cuộc gọi đắt tiền trên mỗi trang không?
Kevin
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.