Перенаправление htaccess для маршрутов Angular
У меня есть приложение angular с несколькими маршрутами, например:
site.com/
site.com/page
site.com/page/4
Используя режим маршрутизации angular html5, они корректно разрешаются, когда вы нажимаете на них ссылки из приложения, но, конечно же, 404 ошибки при интенсивном обновлении. Чтобы исправить это, я попытался реализовать базовый перехват htaccess.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} !OPTIONS
RewriteRule ^(.*)$ index.html [L]
Это работает для запросов angular, однако, когда я пытаюсь загрузить скрипты или сделать ajax-вызовы в моем домене, например:
<script src="/app/programs/script.js"></script>
Этот script не загружается - запрос перенаправляется и пытается загрузить страницу index.html, поскольку .htaccess считает, что он должен перенаправить запрос - не зная, что этот файл существует, и он должен загрузить файл вместо перенаправления.
Есть ли способ, чтобы htaccess перенаправлял запрос index.html(с параметрами представления) только в том случае, если нет фактического файла, который он должен решить?
Ответы
Ответ 1
Используйте фрагмент, например:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html [NC,L]
Это позволит перейти к фактическому ресурсу, если он есть, и index.html для всех маршрутов angularjs.
Ответ 2
Возникла проблема, если приложение запросило directive
файл шаблона, но отсутствует файл. В некоторых случаях приложение вызвало несколько файлов script в index.html
.
мы должны отправить ответ 404
вместо файла index.html
, если файл не существует. Поэтому я добавляю простой шаблон регулярного выражения, чтобы идентифицировать отсутствующий запрос файла.
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested pattern is file and file doesn't exist, send 404
RewriteCond %{REQUEST_URI} ^(\/[a-z_\-\s0-9\.]+)+\.[a-zA-Z]{2,4}$
RewriteRule ^ - [L,R=404]
# otherwise use history router
RewriteRule ^ /index.html
Ответ 3
Решение бедного человека (не использующее mod_rewrite):
ErrorDocument 404 /index.html
Ответ 4
Я предоставил еще один подробный файл htaccess, если вам нужно:
- Обратите внимание на файл baseUrl и индекс по умолчанию
- Удалите ведущую косую черту для управления: params
Вот мой htaccess, очень близкий, но более конкретный:
DirectoryIndex index.html
RewriteEngine on
RewriteBase /subDir
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) index.html [NC,L]