#php #apache #.htaccess
#php #apache #.htaccess
Вопрос:
Мой htaccess перенаправляет css, js-файлы тоже. Я пробовал это, но не сработало. Все мои js-файлы перенаправляются на page.php .
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/(.*)$ page.php?lang=$1amp;page=$2 [NC,QSA,L]
RewriteRule ^(.*)$ page.php?page=$1 [NC,QSA,L]
Комментарии:
1. RewriteConds применяется только к следующему RewriteRule. Вы сделали свое первое правило зависимым от двух условий, при которых запрашиваемый URL-адрес не соответствует существующему файлу папки здесь, но второе полностью не зависит от этого.
2. Чтобы сделать жизнь немного проще, вы могли бы перенаправить все запросы на несуществующие файлы на index.php (таким образом, у вас есть только одно правило перезаписи в вашем htaccess), а затем используйте маршрутизатор для обработки маршрутизации. Таким образом, у вас есть логика URL в вашем приложении, что значительно упрощает перенос его на новый веб-сервер (например, nginx) в будущем.
Ответ №1:
Как отмечено в комментариях, RewriteCond
директивы применяются только к первой RewriteRule
следующей директиве. Итак, вам нужно будет повторить эти условия и для второго правила.
Однако, в зависимости от вашей структуры URL, вам могут вообще не понадобиться эти условия, если вы просто сделаете свое регулярное выражение более конкретным — это также будет более эффективным, поскольку проверки файловой системы относительно дороги.
Например, предполагая, что ваш «код языка» (необязательный первый сегмент пути) состоит из 2 строчных букв, а page
сегмент пути URL не содержит точек (которые в противном случае можно было бы спутать с расширениями файлов), тогда вы могли бы переписать свои директивы следующим образом:
RewriteEngine On
RewriteRule ^([a-z]{2})/([^/]*)$ page.php?lang=$1amp;page=$2 [QSA,L]
RewriteRule ^([^/]*)$ page.php?page=$1 [QSA,L]
Поскольку регулярные выражения теперь более строгие и больше не конфликтуют, порядок этих директив не имеет значения.
NC
Флаги не требуются, если у вас нет кодов языка со смешанным регистром.
Вы также можете сделать еще один шаг и объединить эти два правила в одно, сделав сегмент языкового пути необязательным. Параметр lang
URL теперь всегда будет присутствовать, но может быть пустым.
RewriteRule ^(?:([a-z]{2})/)?([^/]*)$ page.php?lang=$1amp;page=$2 [QSA,L]