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

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

решение бедного человека (не используя mod_rewrite):

ErrorDocument 404 /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>