I18n с friendly-id и globalize3 - избегайте дублирования контента (SEO)

В классическом многоязычном веб-сайте rails 4 я хочу избежать проблемы дублированного контента.

Я использовал friendly-id и globalize3, чтобы сделать сайт многоязычным.

Вот моя конфигурация:

классическая модель страницы:

extend FriendlyId
friendly_id :title, use: [:slugged, :history]
translates :title, :content, :slug

конфигурация первых маршрутов:

scope ":locale", /#{I18n.available_locales.join("|")}/ do
  my_routes
end

#rails cast solution
match '*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }, via: :all
match '', to: redirect("/#{I18n.default_locale}"), via: :all

Конфигурация приложения-контроллера первого приложения:

before_action :set_locale

def default_url_options(options = {})
  {locale: I18n.locale}
end

private
def set_locale
    I18n.locale = params[:locale] if params[:locale].present?
end

Поскольку я хочу, чтобы пользователи получали доступ к сайту без / the-default-locale в конце URL-адреса, я изменяю конфигурацию следующим образом:

Конфигурация маршрутов:

#Here I'm trying to avoid /en/content and /content to avoid duplication

match "/#{I18n.default_locale}/*path", to: redirect("/%{path}"), via: :all
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
  my_routes
end

#removed the rails cast fallback to default locale

Конфигурация контроллера приложения:

before_action :set_locale

def default_url_options(options = {})
  { :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) }
end

private
def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
end

ссылки для переключения между языками:

#here the French language is the default locale
<%= link_to_unless_current t("English"), locale: "en" %>
<%= link_to_unless_current t("French"), locale: nil %>

Вопросы:

1- С понятными идентификаторами и переведенным слагом вы можете перейти на mywebsite.com/mon_contenu и mywebsite/en/my_content. Но если вы уже находитесь на mywebsite.com/mon_contenu и нажимаете на переключатель на английском языке, вы попадете на mywebsite.com/en/mon_contenu с английским контентом, но URL-адрес не переключается на английский слаг.

Это считается дублирующим контентом? И если да, как я могу избежать этого?

2. С globalize, если контент не переведен, он будет отображать контент локали по умолчанию. Таким образом, mywebsite.com/mon_contenu и mywebsite.com/en/my_content могут отображать одно и то же содержимое на одном языке, если перевод не выполнен.

Опять же это рассматривается как дублирование?

Варианты рассматриваются

  • Использование robot.txt для отключения некоторых маршрутов, например, для индексации только локали по умолчанию?

  • Использование канонического тега, но я не знаю, как легко настроить его в макете

Как вы справляетесь с такими ситуациями?

Любая помощь / идея / комментарий / совет всегда приветствуется!

Как всегда, спасибо за вашу помощь.

1 ответ

Решение

Несколько месяцев спустя я все еще пытаюсь выяснить лучшие варианты.

Вот решение, которое я использую для вопроса 1:

Я установил это в контроллерах (решение от railscasts о friendly_id)

def show
  if request.path != page_path(@page)
    redirect_to @page, status: :moved_permanently
  end
end

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

Я буду обновлять этот пост, если я что-то понял для второго пункта! На самом деле я думаю о чем-то, чтобы проверить, существует ли перевод, и если нет, перенаправить на локаль по умолчанию с уведомлением.

Другие вопросы по тегам