Переписать правила для apache 2 для использования с angular js - программирование
Подтвердить что ты не робот

Переписать правила для apache 2 для использования с angular js

Очевидно, что существует множество дискуссий и ответов на изменение мода в Интернете. Тем не менее, я с трудом хватаю их. Поэтому я думал, что попрошу здесь.

Я прошу переписать правила, чтобы сделать то, что объяснил Энди Джослин в комментариях здесь: qaru.site/info/67628/...

Это моя текущая структура dir в корне example.com

  • приложение /
  • app/index.html( "корень" приложения angular js)
  • api (Это будет приложение symfony 2, которое используется для "api". Я буду отправлять запросы ajax и отсюда из angular.)

Я хотел бы перенаправить все запросы в app/index.html, кроме запросов в /api.

Например:

http://example.com/categories/electronics/ipod на самом деле будет похоже на http://example.com/app/index.html/categories/electronics/ipod

Я хотел бы, чтобы часть app/index.html была скрыта.

Тогда возникло бы исключение для запросов http://example.com/api, потому что мне нужно будет сделать ajax-запросы для этих URL-адресов.

Спасибо за любую помощь и рекомендации.

4b9b3361

Ответ 1

Вот что вам нужно сделать (поместите это в файл /.htaccess):

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/api

# otherwise forward it to index.html 
RewriteRule ^.*$ - [NC,L]
RewriteRule ^app/. /app/index.html [NC,L]

Ответ 2

Принятый ответ на этот вопрос устарел. Теперь вы можете использовать директиву FallbackResource в файле conf с Apache 2.2.16 +.

FallbackResource /app/index.html

Если вы хотите, чтобы директива FallbackResource игнорировала маршруты "/api":

<Directory /api>
FallbackResource disabled
</Directory> 

Ответ 3

Проблема с этим ответом заключается в том, что вы все еще хотите 404s для не найденного файла. В зависимости от того, как человек создает свое внешнее приложение, очень часто для людей, когда css или другие файлы возвращаются 404, особенно если они строят большие динамические приложения или передают внешний интерфейс на внешний интерфейс. Кроме того, маршруты angular обычно не связаны ни с чем в файловой системе. Вышеупомянутое может работать, если вы сузите его до одного каталога. Например, я часто использую общий префикс для всех маршрутов angular, который не связан с макетом файловой системы (/ajs/). Если вы можете сделать

<Directory /ajs>
FallbackResource /app/index.html
</Directory> 

Тогда это будет иметь больше смысла, но это, похоже, не работает для меня. Использование общего префикса также делает бэкэнд-правила более простыми, независимо от бэкэнд. Например, вы можете настроить простой серверный контроллер, если вы не используете обратный прокси. И это упрощает моделирование правил перезаписи apache. Например:

RewriteEngine On
RewriteRule ^/ajs/(.+)$ /index.html

Тем не менее, я раньше не видел метод directory/fallback, поэтому мне интересно изучить его, когда единственное переписывание, которое мне нужно, - для angular forward. Спасибо!

Ответ 4

Это небольшая вариация и разработка замечательного ответа Скотта Фергюсона. Мне легче использовать директиву <Location>, чем <Directory>. Директива <Directory> принимает абсолютное имя пути, которое может быть различным на разных машинах.

Итак, скажем, что ваше приложение Angular index.html находится в my-app/index.html под корнем документа вашего веб-сервера. И вы хотите получить доступ к приложению, используя http://localhost/my-app.

Прежде всего убедитесь, что ваш базовый href является "/my-app/". Затем в файле httpd.conf добавьте:

<Location "/my-app">
    FallbackResource /my-app/index.html
</Location>

Это заставит Apache загружать index.html, если какой-либо ресурс в /my-app/ не найден.

Если вы вызываете вызовы API под одним и тем же путем, например say /my-app/api, то вам, вероятно, не следует применять правило FallbackResource для этих вызовов. Поэтому добавьте:

<Location "/my-app/api">
    FallbackResource disabled
</Location>