.htaccess语言检测规则

.htaccess语言检测规则,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我在.htaccess上遇到了一些问题 我的简化文件服务器结构如下所示: /index.php /signup.php 我需要使用虚拟URL来处理语言切换: www.mydomain.com/en/signup.php www.mydomain.com/de/signup.php 所以my.htaccess应该检查url是否包含/en/或/de/,并将其翻译为例如/signup.php?language=de 基本上说,它应该去掉语言标签,但保留文件夹结构的其余部分 它应该可以在本地x

我在.htaccess上遇到了一些问题 我的简化文件服务器结构如下所示:

/index.php
/signup.php
我需要使用虚拟URL来处理语言切换:

www.mydomain.com/en/signup.php   
www.mydomain.com/de/signup.php
所以my.htaccess应该检查url是否包含/en/或/de/,并将其翻译为例如
/signup.php?language=de

基本上说,它应该去掉语言标签,但保留文件夹结构的其余部分

它应该可以在本地xampp和live server上运行。
有什么想法吗?谢谢

到目前为止你都试了些什么?类似于以下的方法应该可以工作:

RewriteRule ^/(en|de)/(.*)$  $2?language=$1 [L]
意思很明显:取第二个匹配(
$2
),即URL中第二个斜杠之后的内容,将
?language=
延迟到它之后,然后是第一个匹配(
$1
),即前两个斜杠之间的内容-前提是它是
en
de
中的一个。 如果要将任何内容(不仅是
en
de
)作为语言匹配,请将规则更改为:

RewriteRule ^/(.+?)/(.*)$  $2?language=$1 [L]
请注意:第一组中的
将使匹配在第一个斜杠处停止,这样您就不会重写eg

/en/subdir/pippo.php

而是

subdir/pippo.php?language=en
如果有疑问,Apache网站上会有一个链接


编辑:默认语言

要使所有其他请求(即不以
/en/
/de/
开头的URL)重定向到默认语言(例如
en
),首先您必须知道要识别的语言前缀,然后使用以下规则-下面,我假设有三种-3-语言,代码
en
de
fr

RewriteEngine On
RewriteBase /

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

如果在第一个
重写规则中未定义确切的语言集(例如使用我以前的“任意语言”解决方案),则嵌套页面上的语言检测可能会失败。规则的顺序很重要,因为第一个规则将匹配语言代码的页面,然后退出,而第二个规则将仅在第一个规则不匹配时应用

这看起来很好:)如何将我的语言默认设置为EN?例如,如果没有定义语言标记->重定向到mydomain.com/en/?由于所有这些规则都被标记为
[L]
(选中最后一条规则),您可以在它们之后编写一个英语重定向:
RewriteRule^(.*)$$1?language=$1[L]
但此规则必须是最后一条。@Fuxi您只想要mydomain.com->mydomain.com/en/,或者所有mydomain.com/stuff都转到mydomain.com/en/stuff?第二条规则有点复杂——是的,我需要第二条选择:/对我来说,第二条规则并没有像预期的那样有效。我的css、js和图像没有正确重定向,尽管我已经重写了cond%{REQUEST_FILENAME}-f并重写cond%{REQUEST_FILENAME}-重写规则之前的d语句。但当我将第二个重写规则更改为:RewriteRule^(+?)?/$index.php?url=$1&lang=de[L,QSA]时,它就起作用了
RewriteEngine On
RewriteBase /

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