使用htaccess和多语言站点的重写规则

时间:2014-07-14 13:27:45

标签: apache .htaccess mod-rewrite

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

目标是重写网址,例如从:

/en/prod/index.php

/prod/index.php?lang=en

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

第二个(和MAIN )问题: 如果文件存在(在我之前的示例中)/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]

2 个答案:

答案 0 :(得分:1)

尝试:

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]

答案 1 :(得分:1)

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

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]