Jak zmusić kanoniczny adres URL do używania http?

10

Na naszej stronie używamy modułu Metatag do wyświetlania kanonicznego metatagu. W konfiguracji używamy [current-page:url:absolute]tokena. Działa to dobrze, ale problem polega na tym, że niezależnie od tego, czy strona uzyskuje dostęp przez HTTP lub HTTPS, ten protokół jest używany w kanonicznym adresie URL.

Dla celów SEO chcemy, aby kanoniczny adres URL był taki sam i używał HTTP dla obu protokołów.

Jak możemy to osiągnąć?

skoczek
źródło
2
Zamiast tego robić w Drupal, po prostu wymuszałbym domyślnie cały ruch do HTTPS poprzez .htaccesskonfigurację lub Apache. Problem rozwiązany.
leymannx

Odpowiedzi:

8

Drupal 7

Możesz zaimplementować hook_html_head_alter()zmianę tagów głowy; następujące rzeczy nie są testowane, ale powinny wystarczyć:

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
źródło
2

Za pomocą modułu metatagu można użyć tokena [current-page: url: relative] zamiast tokenu [current-page: url: bezwzględny].

więc twój kanoniczny tag mógłby wyglądać następująco: http: //www.mywebsite [current-page: url: relative]

rvb
źródło
0

Drupal 8

W przypadku węzłów musisz użyć, hook_ENTITY_TYPE_view_alterponieważ jest to miejsce, z którego zostały początkowo dodane NodeViewController::view().

I proszę zauważyć, że prawdopodobnie lepiej jest, po prostu domyślnie przekierowując cały ruch przychodzący na SSL: Jak po prostu zrobić całą witrynę HTTPS?

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

Właśnie się dowiedziałem, że w końcu znajdziemy wszystkie znaczniki head hook_preprocess_htmlw $variables['page']['#attached']tablicy, które należy zmienić.

leymannx
źródło
-2

Nazywaj mnie szalonym i popraw mnie, jeśli się mylę, ale czy nie możesz po prostu zakodować adresu URL za pomocą HTTP?

Jestem pewien, że coś mi brakuje, ale jeśli wpiszesz pełny adres URL zamiast tokena, skończysz na tym konkretnym adresie URL jako kanonicznym dla każdej odmiany strony, którą tworzy Drupal.

Zastrzeżenie polega na tym, że tworzy koszmar aktualizacji, ponieważ musisz pamiętać, aby zmienić kanoniczny, jeśli alias strony kiedykolwiek się zmieni.

Mikrofon
źródło
Czasami, na przykład podczas korzystania z dostępu do domeny, niektóre artykuły są dostępne tylko w określonych domenach, a na stałe zakodowany adres URL tworzy martwe linki.
Mołot