現在のページがモジュール/テンプレートからの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内で、このコードはどの関数に含まれますか?
ジョーダンマグナソン

1
このコードをtemplate_preprocess_page(&$ variables)内に配置できます
fzmaster

これはhook_exit()で実装することもできます
sheldonkreger 14年

403を処理する場合は、次を使用できますif ($status == '403 Forbidden') { /* ... do stuff ... */ }
。– tyler.frankenstein

2
注:system.404ルートページに基づくDrupal 8のソリューションは、Configuration> System> Basic site settingsで 404ページとしてノードページを指定した場合は機能しません。カスタム404ページが指定されている場合でも指定されていない場合でも機能するソリューションについては、@ Gervaseの回答を参照してください。
ジェームズウィルソン

11

Drupal 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
ジェームズウィルソン

1
ただし注意してください-そこに再構築されたオブジェクトには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変数がノードパスに設定されている場合は空にならないため、追加のチェックが必要になります。
ガップ14

menu_get_item、ページごとに少し高価な呼び出しはありませんか?
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.