web-dev-qa-db-ja.com

ビューのパスにより404ページが表示されない

D7、ビュー3。ビューパスのしくみに少し戸惑っています。私のサイトには次のパスがあります:

mysite.com/people-すべての人のリストを表示するビュー

mysite.com/people/alice-アリスに関する記事

mysite.com/people/bob-mysite.comにはそのような記事はありません

/people/aliceにアクセスすると、記事が届きます。そして、/people/bobに行くと、当然404ページが表示されることを期待しています。ただし、代わりに/peopleビューが表示されます。おそらくパスの「人」の部分が表示され、いくつかのパラメーターを指定して/peopleビューを呼び出したと思います。 /peopleビューにパラメータがなく、常にすべての人のリストを表示することを期待しているので、Drupalのパス解決プロセスに入らないようにするにはどうすればよいですか?

5
Ari Linn

これは、ビューモジュールの問題ではありません。 Drupalの動作方法です。

menu_get_item() を見ると、次のコードに気づくでしょう。

_$original_map = arg(NULL, $path);

$parts = array_slice($original_map, 0, MENU_MAX_PARTS);
$ancestors = menu_get_ancestors($parts);
$router_item = db_query_range('SELECT * FROM {menu_router} WHERE path IN (:ancestors) ORDER BY fit DESC', 0, 1, array(':ancestors' => $ancestors))->fetchAssoc();
_

次のコードをテストサイトで試しました。

_$original_map = arg(NULL, 'people/bob');

$parts = array_slice($original_map, 0, MENU_MAX_PARTS);
$ancestors = menu_get_ancestors($parts);
_

私が得たものは、次の項目を含む配列です:

  • 人/ボブ
  • 人/%

あなたの場合、people/bob、people /%のメニューコールバックがないため、menu_get_item()から実行されるクエリは、定義したビューであるpeopleのメニューコールバックを見つけます。

People/bobがビューページを返さないようにするために、次のコードでカスタムモジュールを作成します。

_function mymodule_menu() {
  $items['people/%'] = array(
    'page callback' => 'mymodule_people_view',
    'page arguments' => array(1), 
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );
}

function mymodule_people_view($username) {
  $alias = "people/$username";
  $path = drupal_get_normal_path($alias);

  if ($alias == $path) {
    // $alias is not a defined alias; in this case, drupal_get_normal_path()
    // returns the string it gets as argument.
    drupal_not_found();
  }
  else {
    drupal_goto($path);
  }
}
_

この問題を解決するモジュール( Views 404 )があり、Drupal 7.のバージョンがあります。

404を返すはずのビューが200を返していますか? Views404が答えです。これはどのキャッシングレイヤーにも非常に役立ち、SEOに役立ちます。 [...]標準Drupal動作は、要求されたかどうかに関係なく、すべての引数を渡すことです。場合によっては、この動作が望まれます。ビュー404モジュールは、デフォルトでは引数を渡さないことを想定していますビューの404は、ArgumentsでGlobal:Nullを設定することでも実現できます。

4
kiamlaluno

ビューはこれをネイティブに実行できますが、非表示で直感的ではありません。

  • コンテキストフィルターをビューに追加し、それをGlobal:Nullとして設定します。

  • Global:Nullの設定では、WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED check Specify validation criteriaおよびValidatorをBasic ValidationおよびActionをShow "Page not found"に設定します。セクション引数が指定されている場合は、基本検証の失敗をチェックします。

0
ChristophWeber

モジュールの作成(またはベータモジュールのインストール)は少し面倒です。だから私はempty textこれに対する私の見解

<?php
if (arg(1)){
  drupal_set_header($_SERVER ['SERVER_PROTOCOL'] . ' 404 Not Found');
  watchdog('page not found', check_plain($_GET ['q']), NULL, WATCHDOG_WARNING);
  drupal_set_title(t('Page not found'));
  echo t('The requested page could not be found.');
}
?>
&nbsp;

そしてinput formatからPHP code

これは機能しますが、IMHOこれは、引数を使用しないビューのデフォルトの動作です。

0
Chris Wesseling