2014-07-14 60 views
0

我为我的multil找到了以下.htaccess文件。项目。 但是有一些问题我无法解决。使用htaccess和多语言网站的重写规则

目标是重写URL,例如来自:

/en/prod/index.php 

/prod/index.php?lang=en 

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

二(和主要)问题: 如果文件存在(在我前面的例子)/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] 

回答

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] 
+0

谢谢!你能否在'%{DOCUMENT_ROOT}'之后更好地向我解释'%2'? “RewriteRule”的第一部分不能包含像'%1'或'$ 1'这样的变量以避免重复'(it | en)'? – Perocat

+0

@Perocat试图确定'%{REQUEST_URI}'行中的匹配组“(。*)”是否存在。 –

+0

谢谢!因此它检查是否存在'DOCUMENT_ROOT/files/file.php'成为'DOCUMENT_ROOT/files/file.php'(其中'$ 2'是从'(。*)中取得的'files/file.php') '在第一个RewriteCond中的'/(it | en)/'之后)? – Perocat

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] 
+0

谢谢!在lang = $ 1之后应该添加的文件之后的变量是什么? – Perocat

+0

这将通过使用'QSA'标志照顾。这将使URI像这样''/prod/index.php?lang=fr&foo=bar&id=123' – anubhava

+0

当语言不存在时原来的'?'会自动被'&'替换? – Perocat