用于语言检测的.htaccess规则

11

我遇到了一些与 .htaccess 相关的问题,我的简化文件服务器结构如下:

/index.php
/signup.php

我需要使用虚拟URL来处理语言切换:

www.mydomain.com/en/signup.php   
www.mydomain.com/de/signup.php

因此,我的 .htaccess 应该检查 URL 是否包含 /en/ 或 /de/ ,并将其翻译为例如 /signup.php?language=de

简单来说,它应该去掉语言标记,但保留其余的文件夹结构。

它应该在我的本地 XAMPP 和我的在线服务器上都能工作。 有任何想法吗?谢谢。

1个回答

16

你目前尝试了什么?类似以下的代码应该能解决问题:

RewriteRule ^/(en|de)/(.*)$  $2?language=$1 [L]
意思相当明显:获取第二个匹配项($2),也就是URL中第二个斜杠后面的部分,在它后面加上一个?language=,然后获取第一个匹配项($1),也就是在前两个斜杠之间的内容——只要它是ende之一。 如果你想匹配任何语言(不仅限于ende),那么把规则改成以下形式即可:
RewriteRule ^/(.+?)/(.*)$  $2?language=$1 [L]
请注意:第一组中的?会使匹配停止在第一个斜杠处,这样您就不会重写例如。
/en/subdir/pippo.php

pippo.php?language=en/subdir

但是而不是

subdir/pippo.php?language=en

如果有疑问,可以在Apache网站上查看优秀的文档


编辑:默认语言

为了使其他请求(即不以/en//de/开头的URL)重定向到默认语言(比如en),首先您需要知道您要识别的语言前缀,然后使用以下规则 - 假设有三种语言,分别是endefr

RewriteEngine On
RewriteBase /

RewriteRule ^(en|de|fr)/(.*)$  $2?language=$1 [L,QSA]
RewriteRule ^(.*)$  $1?language=en [L,QSA]

如果您在第一个RewriteRule中没有定义确切的语言集(例如使用我的先前“任何语言”解决方案),则语言检测可能会在嵌套页面上失败。重要的是按照这个顺序编写规则,因为第一个规则将与具有语言代码的页面匹配,然后退出,而只有在第一个规则不匹配时才会应用第二个规则。


@Fuxi 你想将 mydomain.com -> mydomain.com/en/,还是所有的 mydomain.com/stuff 都去到 mydomain.com/en/stuff? 第二种方案稍微复杂一些。 - Paolo Stefan
嗨Paolo - 是的,我需要第二个选项 :/ - Fuxi
对我来说,第二条规则没有按预期工作。尽管在重写规则之前我已经有了 RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteCond %{REQUEST_FILENAME} !-d 语句,但我的 CSS、JS 和图像没有被正确重定向。但是当我将第二个重写规则更改为:RewriteRule ^(.+?)?/$ index.php?url=$1&lang=de [L,QSA] 时,它就可以正常工作了。 - Erik Čerpnjak
当使用公共文件夹时,如何做到这一点? - TheCrazyProfessor
@PaoloStefan 我的意思是:如果您使用像Laravel框架一样的PublicApp两个文件夹,那么您需要设置网站以“相信”public是根目录。我已经这样做了,如果我输入example.com/en/home,它有点起作用,但如果我输入example.com/da/home,则会失败,并且URL最后看起来像example.com/public/home?lang=da - TheCrazyProfessor
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接