Перезапись URL для мультиязычного сайта с .htaccess (Apache) - PullRequest
0 голосов
/ 13 января 2020

Я не могу понять, как вырезать расширение (. php) в .htaccess, если у меня уже есть 1 виртуальный подкаталог.

1) localhost / admin / index. php? lang = en -> localhost / admin / en /
2) localhost / admin / index. php? lang = ru -> localhost / admin / ru /

для случая 1) и 2) Я уже писал, и это работает.
Решено с -> RewriteRule ^([a-z]+)(/)?$ index.php?lang=$1 [QSA,L]
Пожалуйста, учтите, что (en & ru - виртуальные каталоги)

3) localhost / admin / index. php? Lang = en / createprofiles. php -> localhost / admin / en / createprofiles. php
4) localhost / admin / index. php? lang = ru / createprofiles. php -> localhost / admin /ru/createprofiles.php
Для случаев 3) и 4) Я также написал, и это работает.
RewriteRule ^([en|ru]{2})/(.*)$ $2?lang=$1&%{QUERY_STRING} [L,QSA]

Но я бы хотел сократить. php расширение. Последняя ссылка должна быть такой: localhost / admin / en / createprofiles /

Можете ли вы помочь мне :). Я все перепробовал (около 8 часов), но ничего не работает

Спасибо!

1 Ответ

0 голосов
/ 13 января 2020

Это будет пример, который реализует оба направления:

  1. запросы к «симпатичным URL-адресам» внутренне переписываются в фактические сценарии, а
  2. (возможные) запросы в фактические Сценарии извне перенаправляются на «красивые URL»

Это, очевидно, всего лишь пример, ваш сценарий реального мира обычно немного сложнее. Но этот пример должен указать вам правильное направление ...

RewriteEngine on

RewriteCond %{QUERY_STRING} (?:^|&)lang=(en|ru)(?:&|$)
RewriteRule ^/?admin/?$ /admin/%1 [QSA,R=301]
RewriteCond %{QUERY_STRING} (?:^|&)lang=(en|ru)(?:&|$)
RewriteRule ^/?admin/index\.php$ /admin/%1 [QSA,R=301]
RewriteCond %{QUERY_STRING} (?:^|&)lang=(en|ru)(?:&|$)
RewriteRule ^/?admin/createprofiles\.php$ /admin/%1/createprofiles [QSA,R=301]

RewriteRule ^/?admin/(en|ru)/?$ /admin/index.php?lang=$1 [QSA,END]
RewriteRule ^/?admin/(en|ru)/createprofiles/?$ /admin/createprofiles.php?lang=$1 [QSA,END]

Хорошей идеей будет начать с временного перенаправления 302 (вместо R=301) и изменить его только на 301 постоянное перенаправление позже, когда вы уверены, что все настроено правильно. Это предотвращает проблемы с кэшированием при испытаниях ...

В случае, если вы получаете внутреннюю ошибку сервера (http status 500), используя приведенное выше правило, есть вероятность, что вы используете очень старую версию apache http сервер. В этом случае вы увидите определенный намек на неподдерживаемый флаг [END] в файле журнала ошибок http-серверов. Вы можете попытаться обновить или использовать более старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от ваших настроек.

Эта реализация также будет работать в конфигурации хоста http-серверов или в файле конфигурации Dynami c (файл ".htaccess"). Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на хосте http. Если вы используете файл конфигурации Dynami c, вам нужно позаботиться о том, чтобы его интерпретация вообще была включена в конфигурации хоста и находилась в папке DOCUMENT_ROOT хоста.

И общее замечание: вы всегда должны предпочитать размещать такие правила в конфигурации хоста http-серверов вместо использования файлов конфигурации Dynami c (".htaccess"). Эти динамические c файлы конфигурации добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...