Перенаправление 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]