将语言查询字符串重定向到子目录以获得更好的SEO


Redirect language query string to subdirectory for better 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(再次因为我已经使用它来删除扩展)。事实上,我读过这篇文章(也读过其他文章),但什么都不管用。

完成后,我在谷歌页面上阅读我必须使用的内容:

<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]

即使您使用您标记的帖子中的解决方案,也要进行微小的调整,以满足您丢失的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]

这应该是你的完整.htaccess,它有一个新规则来重定向特定于语言的URL:

#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]

这应该负责重定向。您需要按照@w3d的说明修改您的链接。

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

查询字符串中的|的意思是"或"。如果您想要其他语言,您可以在其中添加它们,也可以将其更改为不太安全的.*