你目前尝试了什么?类似以下的代码应该能解决问题:
RewriteRule ^/(en|de)/(.*)$ $2?language=$1 [L]
意思相当明显:获取第二个匹配项(
$2
),也就是URL中第二个斜杠后面的部分,在它后面加上一个
?language=
,然后获取第一个匹配项(
$1
),也就是在前两个斜杠之间的内容——只要它是
en
或
de
之一。
如果你想匹配任何语言(不仅限于
en
或
de
),那么把规则改成以下形式即可:
RewriteRule ^/(.+?)/(.*)$ $2?language=$1 [L]
请注意:第一组中的
?
会使匹配停止在第一个斜杠处,这样您就不会重写例如。
/en/subdir/pippo.php
到
pippo.php?language=en/subdir
但是而不是
subdir/pippo.php?language=en
如果有疑问,可以在Apache网站上查看优秀的文档。
编辑:默认语言
为了使其他请求(即不以/en/
或/de/
开头的URL)重定向到默认语言(比如en
),首先您需要知道您要识别的语言前缀,然后使用以下规则 - 假设有三种语言,分别是en
,de
和fr
:
RewriteEngine On
RewriteBase /
RewriteRule ^(en|de|fr)/(.*)$ $2?language=$1 [L,QSA]
RewriteRule ^(.*)$ $1?language=en [L,QSA]
如果您在第一个RewriteRule
中没有定义确切的语言集(例如使用我的先前“任何语言”解决方案),则语言检测可能会在嵌套页面上失败。重要的是按照这个顺序编写规则,因为第一个规则将与具有语言代码的页面匹配,然后退出,而只有在第一个规则不匹配时才会应用第二个规则。
Public
和App
两个文件夹,那么您需要设置网站以“相信”public
是根目录。我已经这样做了,如果我输入example.com/en/home,它有点起作用,但如果我输入example.com/da/home,则会失败,并且URL最后看起来像example.com/public/home?lang=da
。 - TheCrazyProfessor