Перепишите правило, чтобы применить код языка по умолчанию в URL-адресе

Я веду блог WP с qtranslate. Это позволяет мне создавать сообщения на нескольких языках.

1 . Пример URL без qtranslate:

www.mysite.com/post1

2 . Пример URL с локализованным контентом:

www.mysite.com/en/post1 (английский — мой вариант по умолчанию и запасной вариант)

www.mysite.com/de/post1

К сожалению, поисковые системы и т. д. все еще помнят мои старые ссылки (1.), и они все еще доступны. Итак, «www.mysite.com/post1» теперь показывает мой английский контент без перенаправления. Но что он должен сделать, так это направить 301 пользователя на "www.mysite.com/en/post1".

Итак, теперь мне нужно правило, которое в основном проверяет, есть ли /en/post1 или /de/post1 в URL-адресе, и в противном случае перенаправляет на резервный / en/post1 URL. Есть одно исключение, потому что «/shop» — это реальный подкаталог, которому не нужно указывать информацию о языке.

-- ОБНОВИТЬ --

Я сделал это!!! Это было на самом деле весело, но мне потребовалось довольно много времени, чтобы понять.

RewriteRule ^$ en [R=301,L]
RewriteRule ^([a-z]{2})/{1}$ $1 [R=301,L]
RewriteRule ^([a-zA-Z0-9\-\_]{3,})(/|$)$ en/$1 [R=301,L]

Вероятно, есть лучшие способы сделать это, но это помогает. Спасибо всем за первоначальную помощь!


person EasyEl    schedule 10.02.2012    source источник
comment
Поиск en, de и т. д. выглядит плохой идеей, это может быть трудно поддерживать. У вас уже есть одно исключение, могут появиться и другие, и это выглядит некрасиво.   -  person Camilo Martin    schedule 10.02.2012
comment
Камило, ты прав. Это некрасиво - я просто недостаточно знаю о Rewrites, чтобы заставить его работать правильно!   -  person EasyEl    schedule 10.02.2012


Ответы (3)


Пробовали ли вы использовать универсальное правило RewriteRule и использовать RewriteConds для устранения случаев, которые вы не хотите переписывать?

Это будет выглядеть примерно так:

RewriteCond %{REQUEST_URI} !^/shop(/|$)
RewriteCond %{REQUEST_URI} !^/(en|de)(/|$)
RewriteRule ^(.*)$ /en/$1 [R=301]

Но, по предложению Камило, вы можете изменить эту среднюю линию на

RewriteCond %{REQUEST_URI} !^/[a-z]{2}(/|$)

при условии, что вы можете гарантировать, что ваши постоянные ссылки не будут меньше трех символов (я недостаточно знаком с WordPress, чтобы быть уверенным, что это возможно).

person Rick    schedule 10.02.2012
comment
Рик, большое спасибо за ваше предложение. К сожалению, это плохо сочетается с существующими редиректами WP и ломает сайт. Там уже есть некоторые условия, и добавление вашего кода конфликтует с ними. ‹IfModule mod_rewrite.c› RewriteEngine On RewriteBase / RewriteRule ^$ en [R=301,L] RewriteRule ^en/$ en [R=301,L] RewriteRule ^de/$ de [R=301,L] ‹/IfModule › ‹IfModule mod_rewrite.c› RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] ‹/IfModule› - person EasyEl; 10.02.2012
comment
Я думаю что-то вроде: RewriteRule !^/(en|de)(/|$) /en/$1 [R=301,L] Хотя это вызывает цикл перенаправления, но должно что-то вот так... - person EasyEl; 10.02.2012

А как насчет использования метаканонического?

Так:

<link rel="canonical" href="http://www.example.com/product.php?item=swedish-fish" />

Дополнительная информация: http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html

person Rochester Oliveira    schedule 10.02.2012
comment
Отличная идея, но Google по-прежнему рекомендует обслуживать контент только с одного URL. Довольно сложно, но с некоторыми исправлениями это работает. Кроме того, это кажется наиболее логичным, на мой взгляд. Просто нужно было самому покопаться в этих Правилах, чтобы действительно понять, как их правильно использовать. - person EasyEl; 11.02.2012

Я сделал это!!! Это было на самом деле весело, но мне потребовалось довольно много времени, чтобы понять.

RewriteRule ^$ en [R=301,L]
RewriteRule ^([a-z]{2})/{1}$ $1 [R=301,L]
RewriteRule ^([a-zA-Z0-9\-\_]{3,})(/|$)$ en/$1 [R=301,L]

Вероятно, есть лучшие способы сделать это, но это помогает

-- ОБНОВЛЕНИЕ, включающее поддержку более длинных URL-адресов ---

RewriteRule ^([a-zA-Z0-9\-\_]{3,}(/|$).*)$ en/$1 [R=301,L]
RewriteRule ^(.+[^/])/$ http://%{HTTP_HOST}/$1 [R=301,L]
person EasyEl    schedule 11.02.2012