如果未选择任何语言,则重定向到默认语言目录-.htaccess

如果未选择任何语言,则重定向到默认语言目录-.htaccess,.htaccess,.htaccess,基本上,我在.htaccess中有几行代码可以检测所选的假*子文件夹语言,并自动重定向到?lang=(所选语言) 因此,任何URL都像这样,例如:localhost/bb/fr/ url中是否会存在后台的localhost/bb/index.php?lang=French,但同时保留请求的假*子文件夹 它工作得很完美,但仍然需要做的是: 如果未选择任何语言且用户位于url:localhost/bb/或localhost/bb/index.php则默认情况下应将其重定向到英语(localhost/

基本上,我在.htaccess中有几行代码可以检测所选的假*子文件夹语言,并自动重定向到?lang=(所选语言)

因此,任何URL都像这样,例如:
localhost/bb/fr/

url中是否会存在后台的
localhost/bb/index.php?lang=French
,但同时保留请求的假*子文件夹

它工作得很完美,但仍然需要做的是:

如果未选择任何语言且用户位于url:
localhost/bb/
localhost/bb/index.php
则默认情况下应将其重定向到英语
localhost/bb/en
,因为他没有选择任何语言

我尝试的是:

RewriteCond !^(fr|en|ar)/?(.*)?$ !-d
RewriteRule !^(fr|en|ar)/?(.*)?$ ./en/$1 [L,R]
但这会导致一个奇怪的无限循环,看起来像:
localhost/bb/en/en/en/en/en/en/en/en/en/en/?lang=English?lang=English?lang=English?lang=English?lang=English?lang=English?lang=English

如果我这样做,结果也是一样的:

RewriteRule ^(?!(?:en|ar|fr)/)(.*)$ en/$1 [R=301,L]
如果我使用类似于:

RewriteCond %{REQUEST_URI} !^/((en|ar|fr)/.*)$
RewriteRule .* ./en/%1 [L,R=301]
这是社区中其他Q答案的建议

它会引发如下错误:
localhost重定向您的次数太多。


任何带有示例的建议或解决方案都将不胜感激

RewriteCond^(fr|en|ar)/?(.*)-d
一开始就完全错了。您正在检查此正则表达式的文本是否与现有目录不匹配。我假设您没有一个名为
^(fr | en | ar)/?(.*)$
-所以这个条件总是正确的,但它绝对不是您认为应该的。是的,我没有那些目录fr/en/ar/等等,如果他们从url调用,我会将thme重定向到背景中的lang?=*但url会保留该假子文件夹,如
localhost/bb/fr/index.php
。。。等等,我是否应该删除RewriteCond,因为它没有做任何有用的事情?如果没有选择lang,我应该如何强制使用默认lang
localhost/bb/en/
?因此,您在内部重定向到的
$1
部分始终与物理上存在的部分匹配?因为如果它没有(并且您进行了额外的重写,最终将其转换为一些路由参数),那么您将很难确定语言前缀何时丢失。如果它始终存在,则放弃当前的重写条件(这只会影响紧跟其后的规则顺便说一句,因此这不会影响您的第二条和第三条规则。)[…][…]然后在三条现有规则之后添加一个条件,检查请求的URI是否与物理上存在的任何内容不匹配(如果你不知道怎么做,请研究一下),在这种情况下,一条规则将重定向到
en/
前缀路径。@CBroe,是的
$1
将始终保留url中实际存在的请求,例如
localhost/bb/en/?article=1&comment=1
RewriteCond %{REQUEST_URI} !^/((en|ar|fr)/.*)$
RewriteRule .* ./en/%1 [L,R=301]