перенаправление htaccess для угловых маршрутов
у меня есть угловое приложение с несколькими маршрутами, такими как:
site.com/
site.com/page
site.com/page/4
используя режим маршрутизации html5 angular, они правильно разрешаются, когда вы нажимаете ссылки на них из приложения, но, конечно же, 404 ошибки при жестком обновлении. Чтобы исправить это, я попытался реализовать базовую перезапись htaccess.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} !OPTIONS
RewriteRule ^(.*)$ index.html [L]
это работает для угловых запросов, однако когда я пытаюсь загрузить скрипты или сделать ajax-вызовы в моем домене, такие как:
<script src="/app/programs/script.js"></script>
этот скрипт не загружается - его запрос перенаправляется и он пытается загрузить индекс.html страница как то .htaccess считает, что он должен перенаправить запрос - не зная, что этот файл существует, и он должен загрузить файл вместо перенаправления.
есть ли способ, которым я могу перенаправить запрос htaccess на индекс.html (с параметрами представления) только если нет фактического файла, который он должен разрешить?
6 ответов:
используйте фрагмент типа:
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.
есть проблема, если приложение просит
directive
файл шаблона, но отсутствует. В некоторых случаях это вызвало приложение запросило несколько файлов скриптов в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
в моем случае я создаю .htaccess файл, как показано ниже
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) ./index.html [NC,L]
только что добавлено . перед / индекс.html и добавить этот файл в моем домене, как https://example.com/subfolder и это прекрасно работает
я предоставлю еще один подробный файл htaccess в случае, если вам нужно :
- внимательный базовый и индексный файл по умолчанию
- удалите ведущую косую черту для управления: 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]
, проверьте эту ссылку : https://stackoverflow.com/a/49455101/5899936 Создать
.htaccess
файл в корневой папке и pase это в.htaccess
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>