Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 在多语言站点中使用带重写规则的htaccess_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache 在多语言站点中使用带重写规则的htaccess

Apache 在多语言站点中使用带重写规则的htaccess,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我为我的multil找到了以下.htaccess文件。项目 然而,有些问题我无法解决 目标是重写URL,例如从: /en/prod/index.php 到 这必须适用于每个文件夹,而不仅仅是prod。 有时链接在?之后已经有一些变量,因此重写规则应该检测到该?并将其更改为&。 使用我的代码,我可以用&替换?,但如果不存在?,这也适用 第二个问题(和主要问题): 如果文件存在(在我上一个示例中)/prod/index.php,则浏览器应显示此页面,但如果文件不存在,则应将所有请求重定向到inde

我为我的multil找到了以下
.htaccess
文件。项目 然而,有些问题我无法解决

目标是重写URL,例如从:

/en/prod/index.php

这必须适用于每个文件夹,而不仅仅是prod。 有时链接在
之后已经有一些变量,因此重写规则应该检测到该
并将其更改为
&
。 使用我的代码,我可以用
&
替换
,但如果不存在
,这也适用

第二个问题(和主要问题): 如果文件存在(在我上一个示例中)
/prod/index.php
,则浏览器应显示此页面,但如果文件不存在,则应将所有请求重定向到
index.php

在我的代码中,请求总是被重定向,因为文件与链接不对应,所以条件不匹配

谢谢你的帮助

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteCond %{QUERY_STRING} ^(\??)(.*)$ [NC]
RewriteCond %{REQUEST_URI} ^/(it|en)/(.*)$ [NC]

#is it possible here to have %3 instead of rewriting (it|en)? Does not work...
RewriteRule ^(it|en)/(.*)$ /%3/$2?lang=%3&%2 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.*$ index.php [NC,L]
尝试:


您可以使用以下通用规则:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/$2 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$2 -d
RewriteRule ^([a-z]{2})/(.+)$ /$2?lang=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

非常感谢。那么应该在
lang=$1
之后添加的文件后面的变量呢?这将通过使用
QSA
标志来处理。这将生成这样的URI
/prod/index.php?lang=fr&foo=bar&id=123
,当语言不存在时,原始的
将自动替换为
&
?是的,这是真的,
QSA
标志为我们做的。谢谢!你能更好地解释一下
%{DOCUMENT\u ROOT}
之后的
%2
吗?
RewriteRule
的第一部分不能包含像
%1
$1
这样的变量,以避免重复试图确定
%{REQUEST\u URI}
行中匹配的组
(.*)
是否存在的
(it | en)
?@Perocat。谢谢!因此,它会检查
DOCUMENT\u ROOT/it/files/file.php
->是否存在
DOCUMENT\u ROOT/files/file.php
(其中
$2
files/file.php
取自
/(it | en)/
之后的
),以便在重写条件下反向引用匹配项,您需要使用%1、%2、%3等。
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/(it|en)/(.*)$
RewriteCond %{DOCUMENT_ROOT}/%2 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/%2 -d
RewriteRule ^(it|en)/(.*)$ /$2?lang=$1 [L,QSA]

RewriteCond %{REQUEST_URI} ^/(it|en)/(.*)$
RewriteCond %{DOCUMENT_ROOT}/%2 !-f
RewriteCond %{DOCUMENT_ROOT}/%2 !-d
RewriteRule ^(it|en)/(.*)$ /index.php?lang=$1 [L,QSA]
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/$2 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$2 -d
RewriteRule ^([a-z]{2})/(.+)$ /$2?lang=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]