2017-02-14 54 views
1

我的.htaccess目前的样子:不需要的index.php从example.com/{lang}/index.php

RewriteEngine On 

RewriteCond %{THE_REQUEST} \s/+([^/]+)/\?lang=([^\s&]+) [NC] 
RewriteRule^/%2/%1? [R=301,L] 

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

这意味着example.com/{lang}/some-page.php作为example.com/some-page.php?lang={lang}

剩下的问题:example.com/{lang}做不工作,除非它有index.php like`example.com/{lang}/index.php

当我们直接去example.com/{lang}时,我该如何使它工作?

回答

1

如何:

RewriteEngine On 

RewriteCond %{ENV:REDIRECT_rewritten} !=1 
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$ [NC] 
RewriteRule ^([^/]*)$ /%1/$1? [R=301,L] 

RewriteCond %{REQUEST_URI} !^/js/ 
RewriteRule ^([a-z]{2})(?:/([^/]+))?$ $2?lang=$1 [NC,L,QSA,E=rewritten:1] 

我真的不喜欢THE_REQUEST匹配,从而改变了这一切。这也只是重定向您可能不想要的/?lang=xx。我在两条规则中使用了相同的lang字符串匹配,您可能不需要。让我知道。

不确定您是否需要文件或目录存在检查,并且如果不是必要的话,它会放慢速度,因为必须在每个请求上轮询文件系统两次。你有两个字母文件或根目录吗?

+0

没有2个字母的文件/目录,所以我们可以省略。使用你的规则,但是当我去'example.com/xx',我得到一个404 –

+0

我删除了检查。你把它放在根.htaccess文件中? – SuperDuperApps

+0

我添加了检查以避免循环。 – SuperDuperApps