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