it-swarm.com.de

Wie implementiere ich Seite nicht gefunden (404) für unveröffentlichte Inhalte?

Auf meiner Website werden einige Knoten für immer nicht veröffentlicht, anstatt gelöscht zu werden. Ich möchte die Seite "Nicht gefunden" (404) zurückgeben, wenn anonym versucht wird, auf unveröffentlichte Knotenseiten zuzugreifen, anstatt "Zugriff verweigert" (403). Es geht nicht darum, dem Benutzer eine andere Nachricht anzuzeigen, sondern vielmehr darum, den 404-Fehlercode zurückzugeben (wichtig für Bots).

Deshalb habe ich meinem Modul Folgendes hinzugefügt:

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();
  }
}

Auf unveröffentlichten Seiten wird mir jedoch der Zugriff als anonymer Benutzer verweigert. Wie implementiere ich es?

4
camcam

Sie sollten in der Lage sein, dies mit Regeln zu tun:

Mit dem Modul Regeln können Site-Administratoren bedingt ausgeführte Aktionen basierend auf auftretenden Ereignissen definieren (sogenannte reaktive oder ECA-Regeln). Es ist ein Ersatz mit mehr Funktionen für das Trigger-Modul im Kern und den Nachfolger des Workflow-ng-Moduls Drupal 5).

Regeln verwenden ...

Ereignis: Inhalt wird angezeigt (nach Inhaltstyp, wenn Sie dies wünschen)

Bedingung: Inhalt ist veröffentlicht, Negieren

Ereignis: Auf benutzerdefinierte 404-Seite umleiten

enter image description here

Dies erfordert, dass Sie eine benutzerdefinierte 404-Seite einrichten, aber die meisten Leute tun dies trotzdem, und Core kümmert sich um alles andere.

Geben Sie die Fehlerseiten 403 und 404 an Weitere Informationen zum Einrichten einer benutzerdefinierten Seite 403 und 404

7
Geoff

Meine Lösung bestand darin, den Zugriff auf unveröffentlichte Knoten zuzulassen und dann vor dem Rendern der Seite ein 404-Ergebnis zurückzugeben. Wenn Sie andere Module haben, die node_access() steuern oder davon abhängig sind, ist diese Lösung möglicherweise nicht für Sie geeignet.

/**
 * 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();
  }
}

Mein Anwendungsfall war viel eingeschränkter, und so konnte ich hook_node_access() einschränken, um nur die Berechtigungen für anonyme Benutzer zu beeinflussen, und dann hook_node_view_alter() angemeldete Benutzer ignorieren.
Ich habe auch Code aus drupal_deliver_html_page() eingefügt, um eine benutzerdefinierte 404-Nachricht anstelle der von drupal_not_found() angegebenen Site-weiten Seite bereitzustellen

2
gapple
  1. Verwenden Sie das Modul view_unpublished, um anonymen Benutzern Zugriff auf nicht veröffentlichte Knoten zu gewähren. - https://www.drupal.org/project/view_unpublished

  2. Fügen Sie dies Ihrem Modul hinzu:

 /**
 * Implementiert die Funktion hook_init (). 
 */
 MYMODULE_init () {
 // Zeigen Sie für Benutzer ohne Benutzer eine 404 an für unveröffentlichten Inhalt anstelle eines 403. 
 if (user_is_anonymous () && ($ node = menu_get_object ()) && $ node-> status == NODE_NOT_PUBLISHED) {
 drupal_not_found (); 
 drupal_exit (); 
} 
} 
1
tripper54

Ich habe Hook_preprocess verwendet, um sie auf die Seite "Seite nicht gefunden" zu leiten.

Ich konnte sie mit dem folgenden Code auf die 404-Seite umleiten. hoffe, das hilft jemandem in Zukunft.

Dies wurde für eine Drupal 6-Site geschrieben. Ich habe den Code von @ camcam für drupal 6 leicht geändert. Sie können seinen Code für drupal 7 verwenden und drupal_exit () für die exit () -Methode verwenden.

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();
            }
    }

}}

prost. Dies ist mein erster Beitrag hier.

0
danuddara

Ich habe immer Folgendes verwendet: https://www.drupal.org/project/unpublished_404

Es wird derzeit aufgrund eines Sicherheitsproblems nicht gewartet (und ist gerade dabei, einen neuen Betreuer zu erhalten). Für dieses Modul ist jedoch im Problemforum ein Patch verfügbar.

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

0
Trevor Lee