将语言查询字符串重定向到子目录以获得更好的 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
我在 Whosebug 中阅读了其他帖子,但是,我不想使用 PHP 框架,而且我读到我必须使用 Mod 重写(同样是因为我已经在使用它用于删除扩展名)。事实上,我读了这个post(还有其他人),但没有任何效果。
完成后,我阅读了 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}/ [R=301,L]
#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [R=301,L]
Options +FollowSymlinks -MultiViews
#Rewrite url
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ .php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ .html
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^([^/]+)/([^/]+) /?lang= [L,NC,QSA]
即使您使用 post 中的解决方案,您也标记了一个微小的改编以满足您缺少的 php 文件结尾:
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^([^/]+)/([^/]+) /?lang= [L,NC,QSA]
这应该会处理重定向。您需要按照@w3d 所述修改您的链接。
RewriteCond %{QUERY_STRING} ^lang=(en|es)$ [NC]
RewriteRule ^contact$ /%1/contact? [R=301,L]
查询字符串中的 |
表示 'or' 如果您需要其他语言,您可以在其中添加它们,或者您可以将其更改为不太安全的 .*
.
这应该是您的完整 .htaccess,带有重定向 lang 特定 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}/ [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 ^(.+?)/?$ .php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+?)/?$ .html [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
RewriteRule ^([^/]+)/([^/]+) ?lang= [L,QSA]
我正在 PHP 开发一个支持多种语言(英语和西班牙语)的网站,使用如下参数:
www.website.com/contact?lang=en
www.website.com/contact?lang=es
是的,没有扩展名。php... 我知道这是一种不好的做法,所以我想要这个:
www.website.com/en/contact
www.website.com/es/contact
我在 Whosebug 中阅读了其他帖子,但是,我不想使用 PHP 框架,而且我读到我必须使用 Mod 重写(同样是因为我已经在使用它用于删除扩展名)。事实上,我读了这个post(还有其他人),但没有任何效果。
完成后,我阅读了 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}/ [R=301,L]
#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [R=301,L]
Options +FollowSymlinks -MultiViews
#Rewrite url
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ .php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ .html
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^([^/]+)/([^/]+) /?lang= [L,NC,QSA]
即使您使用 post 中的解决方案,您也标记了一个微小的改编以满足您缺少的 php 文件结尾:
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^([^/]+)/([^/]+) /?lang= [L,NC,QSA]
这应该会处理重定向。您需要按照@w3d 所述修改您的链接。
RewriteCond %{QUERY_STRING} ^lang=(en|es)$ [NC]
RewriteRule ^contact$ /%1/contact? [R=301,L]
查询字符串中的 |
表示 'or' 如果您需要其他语言,您可以在其中添加它们,或者您可以将其更改为不太安全的 .*
.
这应该是您的完整 .htaccess,带有重定向 lang 特定 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}/ [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 ^(.+?)/?$ .php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+?)/?$ .html [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
RewriteRule ^([^/]+)/([^/]+) ?lang= [L,QSA]