web-dev-qa-db-ja.com

非公開コンテンツにページが見つかりません(404)を実装するにはどうすればよいですか?

私のサイトでは、一部のノードが削除されるのではなく、永久に非公開になります。アクセスが拒否された(403)の代わりに、匿名が非公開のノードページにアクセスしようとした場合、ページが見つかりません(404)を返したいのですが。これは、ユーザーに別のメッセージを表示することではなく、404エラーコードを返すことです(ボットにとって重要です)。

だから私は私のモジュールに以下を追加しました:

function mymodule_init() {
global $user;

  $normal_path = current_path();
  $parts=explode('/', $normal_path);
  $nid_part = $parts[1];
  $node = node_load($nid_part);
  if (!isset($node)) {
    return;
  }
  if (($node->status == 0) &&
    ($node->nid == $nid_part) &&
    ($user->uid == 0)) {
    drupal_not_found();
  }
}

しかし、未公開のページでは匿名ユーザーとしてアクセスが拒否されます。それを実装する方法?

4
camcam

あなたはそれを Rules で行うことができるはずです:

ルールモジュールを使用すると、サイト管理者は発生するイベントに基づいて条件付きで実行されるアクション(リアクティブルールまたはECAルールと呼ばれる)を定義できます。これは、コアのトリガーモジュールのより多くの機能とDrupal 5 workflow-ngモジュールの後継となる置き換えです。

ルールの使用...

イベント:コンテンツが表示されています(必要に応じてコンテンツタイプ別)

条件:コンテンツが公開されている、否定

イベント:カスタム404ページにリダイレクト

enter image description here

これにはカスタムの404ページを設定する必要がありますが、ほとんどの人はとにかくそれを行い、コアは他のすべてを処理します。

403および404エラーページを指定 カスタム403および404ページの設定の詳細

7
Geoff

私の解決策は、非公開ノードへのアクセスを許可し、ページをレンダリングする前に404結果を返すことでした。 node_access()を制御または依存している他のモジュールがある場合、このソリューションは適切ではない可能性があります。

_/**
 * Implements hook_node_access().
 *
 * Allow users to view unpublished nodes, but modify them later to return 404 
 * in hook_view_node_alter().
 */
function MODULE_node_access($node, $op, $account) {
  if ($op == 'view') {
    return NODE_ACCESS_ALLOW;
  }

  return NODE_ACCESS_IGNORE;
}

/**
 * Implements hook_node_view_alter().
 *
 * Provide a 404 page for unpublished nodes.
 * Access is allowed through hook_node_access().
 */
function MODULE_node_view_alter(&$build) {
  $node = $build['#node'];
  if ($node->status == NODE_NOT_PUBLISHED) {
    drupal_not_found();
    drupal_exit();
  }
}
_

私の使用例ははるかに制限されていたため、hook_node_access()を制限して匿名ユーザーの権限のみに影響を与え、ログインしたユーザーをhook_node_view_alter()に無視させることができました。
drupal_deliver_html_page()によって提供されるサイト全体のページの代わりにカスタム404メッセージを提供するために、drupal_not_found()からのコードもインライン化しました

2
gapple
  1. 匿名ユーザーに非公開ノードへのアクセスを許可するには、view_unpublishedモジュールを使用します。 - https://www.drupal.org/project/view_unpublished

  2. これをモジュールに追加します。

 /**
 * hook_init()を実装します。
 */
 function MYMODULE_init(){
 //非ユーザーの場合は、404を表示します非公開コンテンツの場合は403ではありません。 。] drupal_exit(); 
} 
} 
1
tripper54

Hook_preprocessを使用して、「ページが見つかりません」ページに誘導しました。

次のコードでそれらを404ページにリダイレクトすることができました。これが将来誰かのために役立つことを願っています。

これはDrupal 6サイト用に書かれました。 drupal 6の@camcamのコードを少し変更しました。drupal 7の彼のコードを使用し、exit()メソッドにdrupal_exit()を使用できます。

function Hook_preprocess_page(&$vars) {
   global $user;       
     if ($vars['title'] == 'Access denied') {


            $normal_path = $_GET['q'];
            $parts=explode('/', $normal_path);
            $nid_part = $parts[1];
            $node = node_load($nid_part);
            if (!isset($node)) {
              return;
            }
            if (($node->status == 0) &&
              ($node->nid == $nid_part) &&
              ($user->uid == 0)) {
              drupal_not_found();
              exit();
            }
    }

}

乾杯。これが私の最初の投稿です。

0
danuddara

私はいつもこれを使ってきました: https://www.drupal.org/project/unpublished_404

セキュリティ上の問題のため、現在はメンテナンスされていません(新しいメンテナを取得中)ですが、このモジュールのイシューフォーラムにパッチがあります。

https://www.drupal.org/node/2752665#comment-121574

0
Trevor Lee