使用.htaccess切换语言

时间:2018-07-13 13:17:38

标签: .htaccess mod-rewrite seo

我想向我的网站(用PHP 7编写的应用程序)添加另一种语言。 我发现,良好的SEO实践表明,根据语言,应该可以从不同的URL访问我网站上的每个页面。

目前,我的.htaccess文件如下所示:

RewriteEngine on
Options +FollowSymLinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([a-zA-z0-9-]+)$ $1.php [NC,L]

因此,当用户输入(或单击链接)http://example.com/contact时,他们将获得contact.php页面(如果存在)。 我想要实现的是,将http://example.com/en/contact重定向到相同的文件contact.php,但是使用$ _GET参数,并且仍然将/ contact重定向到contact.php (不带此参数)。我以为那是

... everything from above code sample and then:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^en/([a-zA-z0-9-]+)$ $1.php?lang=en [NC,L]

但是它不起作用。有什么想法为什么以及如何使它起作用?

1 个答案:

答案 0 :(得分:0)

最后一个条件检查en/file.php是否存在,从来没有这样。这就是为什么规则从未得到满足的原因。您可以将其删除(但即使在不存在的文件中也将应用它),或者通过重写错误条件来使用此替代方法

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^en/([^/]+)$ /$1.php?lang=en [NC,L]

为更加完整,您还可以重定向尝试直接访问/contact.php?lang=en的用户(对于SEO更好)。这是您最终的htaccess的样子

RewriteEngine On

# if url is /file.php?lang=en and file exists then redirect to /en/file
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \s/([^/\s\?&]+)\.php\?lang=en\s [NC]
RewriteRule ^ /en/%1? [R=301,L]

# if url is /en/file and /file.php exists then internally rewrite to /file.php?lang=en
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^en/([^/]+)$ /$1.php?lang=en [NC,L]

注意:上面的代码特定于en语言,但是您可以轻松地使其适应多种语言