Wie erzwinge ich, dass die kanonische URL http verwendet?

10

Auf unserer Seite verwenden wir das Metatag- Modul, um ein kanonisches Meta-Tag anzuzeigen . In der Konfiguration verwenden wir das [current-page:url:absolute]Token. Dies funktioniert gut, aber das Problem ist, dass dieses Protokoll in der kanonischen URL verwendet wird, unabhängig davon, ob auf die Seite über HTTP oder HTTPS zugegriffen wird.

Für SEO-Zwecke möchten wir, dass die kanonische URL identisch ist und HTTP für beide Protokolle verwendet.

Wie können wir das erreichen?

Jumper
quelle
2
Anstatt dies in Drupal zu tun, würde ich einfach den gesamten Datenverkehr standardmäßig über .htaccessoder Apache config an HTTPS erzwingen . Problem gelöst.
Leymannx

Antworten:

8

Drupal 7

Sie können implementieren hook_html_head_alter(), um Head-Tags zu ändern. Folgendes ist ungetestet, sollte aber den Trick tun:

function MYMODULE_html_head_alter(&$head_elements) {
  foreach ($head_elements as $key => &$tag) {
    if (strpos($key, 'drupal_add_html_head_link:canonical:') === 0) {
      if (strpos('https://', $tag['#attributes']['href']) === 0) {
        $tag['#attributes']['href'] = str_replace('https://', 'http://', $tag['#attributes']['href']);
      }
    }
  }
}
Clive
quelle
2

Mit dem Metatag-Modul können Sie das Token [aktuelle Seite: URL: relativ] anstelle des Tokens [aktuelle Seite: URL: absolut] verwenden.

Ihr kanonisches Tag würde also ungefähr so ​​aussehen: http: //www.mywebsite [aktuelle Seite: URL: relativ]

rvb
quelle
0

Drupal 8

Für Knoten müssen Sie verwenden, hook_ENTITY_TYPE_view_alterda dies der Ort ist, an dem sie ursprünglich hinzugefügt wurden NodeViewController::view().

Und lassen Sie mich bemerken, dass Sie wahrscheinlich besser dran sind, wenn Sie einfach Ihren gesamten eingehenden Datenverkehr standardmäßig auf SSL umleiten: Wie kann man einfach die gesamte Site HTTPS machen?

/**
 * Implements hook_ENTITY_TYPE_view_alter().
 */
function MYMODULE_node_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
  if (isset($build['#attached']['html_head_link'])) {
    foreach ($build['#attached']['html_head_link'] as $key => $head) {
      if ((isset($head[0]['rel']) ? $head[0]['rel'] : FALSE) == 'canonical') {

        $url = \Drupal\Core\Url::fromRoute('<current>', [], ['absolute' => 'true'])
          ->toString();

        $url = str_replace('https://', 'http://', $url);

        $build['#attached']['html_head_link'][$key][0]['href'] = $url;
      }
    }
  };
}

Ich habe gerade herausgefunden, dass wir am Ende alle Head - Tags in finden hook_preprocess_htmlin der $variables['page']['#attached']Anordnung verändert werden.

Leymannx
quelle
-2

Nennen Sie mich verrückt und korrigieren Sie mich bitte, wenn ich falsch liege, aber können Sie die URL nicht einfach mit dem HTTP fest codieren?

Ich bin mir sicher, dass mir etwas fehlt, aber wenn Sie die vollständige URL eingeben, anstatt das Token zu verwenden, erhalten Sie diese bestimmte URL als Kanonik für jede Variation der von Drupal erstellten Seite.

Die Einschränkung besteht darin, dass ein Update-Albtraum entsteht, da Sie daran denken müssen, die Kanonik zu ändern, wenn sich der Alias ​​der Seite jemals ändert.

Mike
quelle
Manchmal, wie bei der Verwendung von Domain Access, sind einige Artikel nur für bestimmte Domains verfügbar, und eine hartcodierte URL führt zu toten Links.
Mołot