Как переписать чистые URL с помощью .htaccess - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть следующее правило .htaccess для настройки языка:

RewriteRule ^en/?$ /index.php?lang=en [NC,L,R=301]
RewriteRule ^fr/?$ /index.php?lang=fr [NC,L,R=301]
RewriteRule ^de/?$ /index.php?lang=de [NC,L,R=301]

Однако, когда я ввожу чистый URL-адрес, например, example.com/fr, URL-адрес перенаправляется в браузер на example.com/index.php?lang=fr.

Как URL-адрес может оставаться чистым?

Я попробовал следующее, но он тоже не работает, URL-адрес не остается чистым:

RewriteRule ^/([^/]+)/? /index.php?lang=$1 [L,QSA,NC]

1 Ответ

0 голосов
/ 10 февраля 2019
RewriteRule ^en/?$ /index.php?lang=en [NC,L,R=301]
RewriteRule ^fr/?$ /index.php?lang=fr [NC,L,R=301]
RewriteRule ^de/?$ /index.php?lang=de [NC,L,R=301]

Для предотвращения внешнего перенаправления вам просто нужно убрать флаг R.Это тогда становится внутренним переписыванием , и URL остается как example.com/fr в адресной строке браузера.Например:

RewriteRule ^en/?$ /index.php?lang=en [NC,L]

Чтобы сделать это более кратким, когда количество языков ограничено, вы можете объединить эти три директивы в одну, используя alternation в регулярном выражении:

 RewriteRule ^(en|fr|de)/?$ /index.php?lang=$1 [NC,L]

$1 - это обратная ссылка на захваченный идентификатор языка: "en", "fr" или "de".

Перед проверкой вам потребуется очистить кеш браузера, поскольку вероятны ошибочные 301быть кэшированным браузером.

RewriteRule ^/([^/]+)/? /index.php?lang=$1 [L,QSA,NC]

Это никогда не будет совпадать в контексте .htaccess, просто из-за префикса косой черты в шаблоне RewriteRule .Так что это ничего бы не сделало.(Возможно, вы видели кешированный ответ, если запрос все еще был перенаправлен?).Это должно читаться следующим образом:

RewriteRule ^([^/]+) /index.php?lang=$1 [L,QSA,NC]

Трейлинг /? на паттерне лишний.Однако это соответствует любому сегменту пути.например.example.com/about или example.com/foo/bar и т. Д.

...