.htaccess语言检测规则

Fux*_*uxi 9 .htaccess mod-rewrite

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

/index.php
/signup.php
Run Code Online (Sandbox Code Playgroud)

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

www.mydomain.com/en/signup.php   
www.mydomain.com/de/signup.php
Run Code Online (Sandbox Code Playgroud)

所以我的.htaccess应检查url是否包含/ en /或/ de /并将其翻译为例如. /signup.php?language=de

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

它应该在我的本地xampp和我的实时服务器上工作.有任何想法吗?谢谢

Pao*_*fan 14

你都尝试了些什么?像下面这样的东西应该工作:

RewriteRule ^/(en|de)/(.*)$  $2?language=$1 [L]
Run Code Online (Sandbox Code Playgroud)

意思是相当明显的:取第二个匹配($2),即在URL中的第二个斜杠之后,推迟一个?language=之后,然后是第一个匹配($1),即前两个斜杠之间的内容 - 提供它的一个ende.如果您想将任何内容(不仅仅是ende)作为语言进行匹配,请将规则更改为:

RewriteRule ^/(.+?)/(.*)$  $2?language=$1 [L]
Run Code Online (Sandbox Code Playgroud)

请注意:?第一组中的匹配将使匹配在第一个斜线停止,因此您不会重写例如.

/en/subdir/pippo.php
Run Code Online (Sandbox Code Playgroud)

pippo.php?language=en/subdir
Run Code Online (Sandbox Code Playgroud)

而是为了

subdir/pippo.php?language=en
Run Code Online (Sandbox Code Playgroud)

如果有疑问,Apache网站上有一个很好的文档.


编辑:默认语言

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

RewriteEngine On
RewriteBase /

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

如果您没有在第一个语言中定义确切的语言集RewriteRule(例如,使用我以前的"任何语言"解决方案),语言检测可能会在嵌套页面上失败.重要的是,规则是在这个订单,因为第一个将匹配的语言代码,然后退出页面,而第二个将仅应用于如果第一个不匹配.