многоязычный hreflang и.htaccess


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

У меня есть https://www.example.com, который на немецком языке и имеет только две страницы: index.html и showreel.html. Теперь я добавил английскую версию на сайт по адресу https://www.example.com/en с переведенной парой страниц index.html и showreel.html, расположенных в /en/ вложенная папка.

После проведения исследования я изменил свой файл .htaccess в корневой папке на этот:


RewriteOptions inherit
RewriteEngine on

RewriteCond %{HTTP_REFERER} !^http://example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://example.com$      [NC]
RewriteCond %{HTTP_REFERER} !^https://www.example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^https://www.example.com$      [NC]
RewriteCond %{HTTP_REFERER} !^https://example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^https://example.com$      [NC]
RewriteCond %{HTTP_REFERER} !^https://www.example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^https://www.example.com$      [NC]
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ - [F,NC]
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^/?$ "https\:\/\/www\.example\.com\/" [R=301,L]

# language is ES (spanish)
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule ^$ /en/ [L,R=301]

# language starts with DE
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ / [L,R=301]

# language starts with FR
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /en/ [L,R=301]

# language starts with IT
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^$ /en/ [L,R=301]

# language starts with EN
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^$ /en/ [L,R=301]

# else redirect to the English version
RewriteRule ^$ /en/ [L,R=301]

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType img/jpg "access plus 1 year"
ExpiresByType img/jpeg "access plus 1 year"
ExpiresByType img/gif "access plus 1 year"
ExpiresByType img/x-icon "access plus 1 year"
ExpiresByType img/png "access plus 1 year"
ExpiresByType css/css "access plus 1 month"
ExpiresByType js/x-javascript "access plus 1 month"
ExpiresDefault "access plus 2 days"
</IfModule>

Кроме того, и index.html, и showreel.html имеют следующие ссылки hreflang в теге HEAD:

<link rel="alternate" hreflang="de" href="/" />
<link rel="alternate" hreflang="en" href="/en/" />
<link rel="alternate" href="/en/" hreflang="x-default" />

Короче говоря: это не сработало. Немецкая "корневая" страница больше не появлялась для браузеров et на немецком языке.

Что должно произойти, так это то, что браузеры с немецким набором будут обслуживаться https://www.example.com. Все остальные посетители будут обслужены https://www.example.com/en

Сможет ли кто-нибудь указать мне, где я нахожусь здесь что-то не так?

Author: MrWhite, 2021-06-11

1 answers

# language starts with DE
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ / [L,R=301]

... Немецкая "корневая" страница больше не появлялась для браузеров et на немецком языке.

Предположительно, вы видите "цикл перенаправления"? Потому что вы не можете перенаправить с A на A (...условно на основе константы, т. Е. заголовок Accept-Language - который одинаков для каждого запроса). Но так как вы уже находитесь на A, нет необходимости перенаправлять на A - вы просто должны ничего не делать.

Например:

# language starts with DE - do nothing, stay on the root URL
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ - [L]

Немецкий набор браузеры будут обслуживаться https://www.example.com. Все остальные посетители будут обслужены https://www.example.com/en

В таком случае я не уверен, почему вы проверяете наличие других языков (ES, FR, IT,...) в своих правилах? Если у вас только два языка и по умолчанию используется EN, вы можете реализовать это в одном правиле:

# Language is not DE then redirect from root to /en/
RewriteCond %{HTTP:Accept-Language} !^de [NC]
RewriteRule ^$ /en/ [R=302,L]

Перенаправляет корневой каталог на /en/, когда заголовок Accept-Language не начинается с de (без учета регистра). Префикс ! в шаблоне отменяет регулярное выражение.

Любой перенаправление такого рода должно быть 302 (временным) перенаправлением, а не 301 (постоянным). (Однако, вам, вероятно, не следует реализовывать языковое "перенаправление" в первую очередь - см. Ниже.)

Кроме того, как насчет /showreel.html? Предполагая, что у вас всего 4 URL-адреса: / и /showreel.html для немецкого языка и /en/ и /en/showreel.html в противном случае вы можете изменить указанное выше перенаправление на следующее, чтобы охватить оба:

# Language is not DE then redirect from root to /en/
RewriteCond %{HTTP:Accept-Language} !^de [NC]
RewriteRule ^(showreel\.html)?$ /en/$1 [R=302,L]

Не реализовывайте языковое "перенаправление"

Однако вам, вероятно, не следует реализовывать язык "перенаправление". Вместо этого позвольте пользователю изменить язык и, возможно, предложите "предложение", если он, по-видимому, просматривает "неправильный" язык.

Перенаправление на основе того, что вы считаете предпочтительным языком, имеет ряд проблем:

  • Пользователи могут использовать общий компьютер (или их компьютер настроен неправильно), поэтому они могут застрять на одном языке, который они не понимают (или не "предпочитают"). Пользователям необходимо предоставить выбор для переключения между языками. Как отмечено в Веб-документах MDN:

    Этот заголовок является подсказкой, которую следует использовать, когда сервер не может определить язык другим способом, например, с помощью определенного URL-адреса, который управляется явным решением пользователя. Рекомендуется, чтобы сервер никогда не отменял явное решение. Содержание языка принятия часто находится вне контроля пользователя (например, при путешествии и использовании интернет-кафе в другой стране); пользователь также может захотеть чтобы посетить страницу на другом языке, отличном от языка их пользовательского интерфейса.

  • Заголовок Accept-Language не обязательно содержит предпочтительный язык в начале значения. Он более сложный и в идеале должен быть проанализирован . Таким образом, проверка только наличия кода языка в начале значения ненадежна для определения "предпочтительного" языка.

    Ссылка: RFC 7231 - Протокол передачи гипертекста (HTTP/1.1): Семантика и Язык принятия контента:

    Обратите внимание, что некоторые получатели рассматривают порядок, в котором перечислены языковые теги, как указание на нисходящий приоритет, особенно для тегов , которым присвоены одинаковые значения качества (ни одно значение не совпадает с q=1). Однако на это поведение нельзя полагаться. Для обеспечения согласованности и максимальной совместимости многие агенты пользователей присваивают каждому языковому тегу уникальное значение качества, а также перечисляют их в порядке убывания качество. Дополнительное обсуждение списков языковых приоритетов можно найти в Разделе 2.3 RFC4647.

  • Googlebot не отправляет заголовок Accept-Langauge (или иногда имеет значение en-US?) таким образом, Googlebot никогда не сможет сканировать версию вашего сайта на немецком языке - он всегда будет перенаправлен на язык "по умолчанию".

    Искатель отправляет HTTP-запросы без указания языка принятия в заголовке запроса.

    Источник: https://developers.google.com/search/docs/advanced/crawling/locale-adaptive-pages

    Обходным решением здесь может быть включение исключения для Googlebot, однако это не может быть надежно сделано в .htaccess и противоречит собственным рекомендациям Google (см. Ссылку Выше).

Далее чтение:


В сторону:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType img/jpg "access plus 1 year"
ExpiresByType img/jpeg "access plus 1 year"
ExpiresByType img/gif "access plus 1 year"
ExpiresByType img/x-icon "access plus 1 year"
ExpiresByType img/png "access plus 1 year"
ExpiresByType css/css "access plus 1 month"
ExpiresByType js/x-javascript "access plus 1 month"
ExpiresDefault "access plus 2 days"
</IfModule>

Все ваши пантомимы выглядят неправильно?! Если mod_expires включен, то все ваши ресурсы, вероятно, кэшируются в течение 2 дней по умолчанию, а не 1 year или 1 month, как, казалось бы, предполагалось?

Вам необходимо проверить типы mime (т.Е. Content-Type Заголовок HTTP-ответа), которые ваш сервер отвечая для этих типов ресурсов.

Ссылка: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types

  2
Author: MrWhite, 2021-10-07 07:34:52