不需要来自example.com/{lang}/index.php的index.php

时间:2017-02-14 19:54:23

标签: php .htaccess

我的.htaccess目前看起来像:

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像`example.com/ {lang} /index.php

当我们直接转到example.com/{lang}时,如何才能使其发挥作用?

1 个答案:

答案 0 :(得分: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字符串使用了相同的匹配。让我知道。

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