@Stepa01
Программист

Почему в этом случае тэг Last в RewriteRule не работает?

Мой .htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^.+\/&
RewriteRule ^([^/]{0,15})$ /\?ref\=$1 [L]

RewriteBase /dash-dev/dist
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /dash-dev/dist [L]

Второе правило разумеется работает без проблем.
Насчёт первого когда я захожу по ссылке 127.0.0.1/ajax/signup, то меня перенаправляет на 127.0.0.1/dash-dev/dist
Я почитал документацию и там написано либо L либо END тэги завершают условие. Если я просто введу адрес 127.0.0.1/ajax/signup.php, то скрипт запускается без проблем.
Подскажите в чём здесь подвох? Мне нужно чтобы всё работало без расширения php.

Я нашел как сделать более подробный лог и вот результаты что сейчас разбираю: https://pastebin.com/HCV8SBti
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
@Stepa01 Автор вопроса
Программист
Наконец-то я смог это сделать.
.htaccess:
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([0-9]{1,7})$ /\?ref\=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} ^/dash-dev/dist/.*
RewriteRule . /dash-dev/dist/ [L]

Мне пришлось всё таки изучить кучу документации
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
shambler81
@shambler81 Куратор тега htaccess
^([^/]{0,15})$ - что по вашему оно делает ?
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Перенаправляет по 3-му правилу.
Т.к. запрос: это не файл, ни директория, ни символическая ссылка.
Чтобы срабатывало 1-е правило, нужно в нём убрать: -f, означающее, что правило работает только при запросе файла.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1[L]
Ответ написан
@dodo512
Как на самом деле работает mod_rewrite
mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться.
Флаг [L] останавливает не весь цикл, а только текущую итерацию обработки запроса.
После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет.
Если запрос изменился, его обработка начинается заново с начала .htaccess.

RewriteBase /

...

RewriteBase /dash-dev/dist

...

Тут подвох в том, что указание двух разных RewriteBase не вызывает каких-либо ошибок синтаксиса или предупреждений, но используется только последнее значение.
Для запроса /ajax/signup срабатывает RewriteRule ^(.*)$ $1.php [L] и перенаправляет на ajax/signup.php, а после добавления RewriteBase получается /dash-dev/dist/ajax/signup.php и обработка начинается заново с начала .htaccess
В итоге срабатывает самое последнее правило RewriteRule . /dash-dev/dist [L]

Нужно убрать RewriteBase /dash-dev/dist
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы