Перенаправить строку языкового запроса в подкаталог для лучшего SEO

Я разрабатываю веб-сайт, который поддерживает несколько языков (английский и испанский) в PHP, используя такие параметры:

www.website.com/contact?lang=en
www.website.com/contact?lang=es

Да, без расширения .php …
Я знаю, что это плохая практика, поэтому я хочу иметь это:

www.website.com/en/contact
www.website.com/es/contact

Я читаю другие сообщения здесь в stackoverflow, но я не хочу использовать каркас PHP, и я прочитал, что я должен использовать Mod Rewrite (опять же, потому что я уже использую его для удаления расширения). На самом деле, я читал это сообщение (и другие тоже), но ничего не работает.

Когда это будет сделано, я прочитал на страницах Google, которые я должен использовать:

<link rel="alternate" href="http://www.website.com/" hreflang="x-default" />

это правильно?

Спасибо

РЕДАКТИРОВАТЬ 1:

Содержание моего .htaccess:

RewriteBase /

#Prevent directory listing
Options All -Indexes

#Disable Etags
Header unset ETag
FileETag None

#Prevent viewing of .htaccess
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
</Files>

RewriteEngine on

#Redirect non-www/www
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Options +FollowSymlinks -MultiViews
#Rewrite url
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html

RewriteCond %{REQUEST_FILENAME} -f  [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]

RewriteRule ^([^/]+)/([^/]+)  /$2?lang=$1 [L,NC,QSA]

3

Решение

Это должен быть ваш полный .htaccess с новым правилом для перенаправления определенных URL-адресов lang:

#Disable Etags
Header unset ETag
FileETag None

#Prevent viewing of .htaccess
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
</Files>

Options All -Indexes -MultiViews
RewriteEngine on
RewriteBase /

#Redirect non-www/www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# redirect /contact?lang=en to /en/contact
RewriteCond %{THE_REQUEST} /+([^?]+?)(?:\.php)?\?lang=([^\s&]+) [NC]
RewriteRule ^ /%2/%1? [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+?)/?$ $1.html [L]

RewriteCond %{REQUEST_FILENAME} -f  [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]

RewriteRule ^([^/]+)/([^/]+) $2?lang=$1 [L,QSA]
1

Другие решения

даже если вы используете решение из поста, который вы отметили с небольшой поправкой, для соответствия отсутствующим окончаниям php-файла:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f  [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]

RewriteRule ^([^/]+)/([^/]+)  /$2?lang=$1 [L,NC,QSA]
2

Это должно заботиться о перенаправлениях. Вам нужно будет изменить свои ссылки, как указано в @ w3d.

RewriteCond %{QUERY_STRING} ^lang=(en|es)$ [NC]
RewriteRule ^contact$ /%1/contact? [R=301,L]

| в строке запроса означает «или», если вам нужны другие языки, вы можете добавить их туда или вы можете изменить их на менее безопасный .*,

1
По вопросам рекламы [email protected]