Как заставить канонический URL использовать http?

10

На нашей странице мы используем модуль Metatag, чтобы показать канонический метатег. В конфигурации мы используем [current-page:url:absolute]токен. Это прекрасно работает, но проблема в том, что при доступе к странице по HTTP или HTTPS этот протокол используется в каноническом URL.

В целях SEO мы хотим, чтобы канонический URL был одинаковым, и используем HTTP для обоих протоколов.

Как мы можем достичь этого?

джемпер
источник
2
Вместо того, чтобы делать это в Drupal, я бы просто принудительно передавал весь трафик на HTTPS по умолчанию через .htaccessконфигурацию Apache. Задача решена.
leymannx

Ответы:

8

Drupal 7

Вы можете реализовать, hook_html_head_alter()чтобы изменить заголовки тегов; следующее не проверено, но должно сработать:

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']);
      }
    }
  }
}
Клайв
источник
2

С модулем metatag вы можете использовать токен [current-page: url :lative] вместо токена [current-page: url: absolute].

поэтому ваш канонический тег станет примерно таким: http: //www.mywebsite [current-page: url: родственник]

RVB
источник
0

Drupal 8

Для узлов вы должны использовать hook_ENTITY_TYPE_view_alterэто место, откуда они изначально были добавлены NodeViewController::view().

И позвольте мне отметить, что вам, вероятно, лучше, просто перенаправив весь ваш входящий трафик на SSL по умолчанию: как просто сделать весь сайт 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;
      }
    }
  };
}

Я только что узнал, что в конце мы найдем все теги head hook_preprocess_htmlв $variables['page']['#attached']массиве, которые нужно изменить.

leymannx
источник
-2

Назовите меня сумасшедшим и поправьте меня, если я ошибаюсь, но вы не можете просто жестко закодировать URL с помощью HTTP?

Я уверен, что кое-что мне не хватает, но если вы укажете полный URL вместо того, чтобы использовать токен, вы получите этот конкретный URL как канонический для каждого варианта страницы, создаваемой Drupal.

Предостережение заключается в том, что он создает кошмар обновления, так как вы должны помнить, чтобы изменить канонический, если псевдоним страницы когда-либо изменится.

Майк
источник
Иногда, например, когда вы используете доступ к домену, некоторые статьи доступны только для определенных доменов, а жестко заданный URL-адрес может создавать неработающие ссылки.
Молот