2017-02-14 2 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, например `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

Не имеют двухбуквенных файлов/каталогов, поэтому мы можем опустить. Однако, используя ваши правила, когда я перехожу на 'example.com/xx', я получаю 404 –

+0

, я удалил чеки. Вы помещаете его в корневой файл .htaccess? – SuperDuperApps

+0

Я добавил проверки, чтобы избежать цикла. – SuperDuperApps