I have a multi-language
page, I want to detect client browser's language then make a 301 home page or other thing. but I am not sure which way is better for seo. I do not know web spider
like which one? Or other way?
<?php
$LG=$_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (preg_match('/^[zZ][hH]/', $LG)) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/cn/");
exit();} //jump to chinese version
else {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/en/");
exit();} //jump to english version
?>
OR
<?php
$LG=$_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (preg_match('/^[zZ][hH]/', $LG)) {
include ("http://mydomain.com/cn/");
} //include chinese version
else {
header("HTTP/1.1 301 Moved Permanently");
include ("http://mydomain.com/en/");
} //include english version
?>
OR other way? Thanks.
I would recommend having a different URL for each language (option 2). It would make analytics much easier (Google Analytics can show which language is more popular if you use the /en, /cn, structure).
Also, users can bookmark and share the proper language and return to it from another computer.
Most importantly, having the same canonical URL serve two different languages will wreak havoc when spiders try to index the page. The indexed content would be unpredictable.
As you already assume in your question, you need to parse the
Accept-Language
HTTP/1.1 header, which is available in PHP in$_SERVER['HTTP_ACCEPT_LANGUAGE']
. This first needs to be parsed into a structure you can better deal within PHP, like an array:Which for
da, en-gb;q=0.8, en;q=0.7
will return:You then need to parse this sorted array to find your first match, setting your preference with the
en
default value:Finally you can do the redirect based on
$lang
(or the include or whatever):If you're looking for a ready-made library to deal with this, one existing solution is the Symfony's
HttpFoundation\Request
or in PEAR there isHTTP::negotiateLanguage
.The PHP intl extension has another low-level function that is related, however it's doesn't offer an array but a single value:
locale_accept_from_http
Another general resource for more HTTP related information is Advanced handling of HTTP requests in PHP.