.htaccess для подпапки приложения AngularJS с режимом HTML5

Обзор:

У меня есть приложение AngularJS, которое использует $locationProvider.html5Mode(true), и оно обслуживается с сервера Apache. До сих пор я использовал исходный код для доступа из других, и мне просто нужно было перенаправить на index.html для режима angularJS HTML5. Поэтому у меня было это для файла .htaccess для моей папки /app.

.htaccess:

<IfModule mod_rewrite.c>

    RewriteEngine on

    # Don't rewrite files or directories
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]

    # Rewrite everything else to index.html to allow html5 state links
    RewriteRule ^ index.html [L]

</IfModule>

Модификации:

Затем я добавил Grunt для минимизации всего решения, которое создается в папке /dist приложения (так что теперь миниатюрное решение найдено в /app/dist ). Теперь я хотел бы направить весь трафик моего приложения на мини-версию, не заставляя пользователей изменять ссылку. Поэтому на практике я хотел бы перенаправить каждый вызов из /app в/app/dist.

Структура каталога теперь:

app
    dist
        minified versions(css,html,js)

Я попытался использовать некоторые условия из здесь в /app.htaccess и перенес другой файл .htaccess в /app/dist, но без успеха. Я даже не знаю, могут ли эти два сочетаться. Я знаю, что вместо этого могу использовать папку dist в качестве /app, но я бы этого не хотел, поскольку /app является репо, и проще обновить его. Итак, как я могу добиться этого с помощью перенаправления?

Кроме того, во-вторых, можно ли каким-то образом поставить флаг, чтобы я мог использовать альфа-пользователей для нормальной отладки обычной (не минированной) версии?

Update:

Я добавил пример проекта для здесь. Я просто сохранил начальные файлы .htaccess, которые я показал выше, и вы можете проверить, что обе версии (/test и /test/dist) работают, как указано выше. Кроме того, у него, вероятно, есть неиспользованный код и зависимости, но я просто вырезал другие части из моего проекта (не судите: D).

Для этого я использовал начальную конфигурацию с AngularJS 1.4.8, которая могла бы генерировать некоторые ошибки, например, указанные здесь и здесь. Не стесняйтесь обновлять версию AngularJS до 1.5.8 (последняя стабильная версия Angular 1), но обратите внимание на комментарии Cosmin Ababei post. Кроме того, в проекте используется npm для установки grunt (и других расширений для grunt), bower для Angular и некоторых других базовых компонентов и ворчания для создания мини-версии (на самом деле, она просто конкатенация ресурсов в одних и тех же файлах). Если вам нужно изменить зависимости, не забудьте запустить bower install. Если вы хотите восстановить папку dist, не забудьте запустить npm install и grunt build.

Ответ 1

Я предполагаю, что внутри каталога /dist у вас есть index.html с обновленными URL-адресами, которые указывают на минимизированные ресурсы и правильный тег <base>. Обратите внимание, что тег <base> должен указывать на папку /dist - просто добавьте /dist к значению, которое вы используете для несжатого index.html, и все будет в порядке.

С этими вещами, здесь обновлен .htaccess файл:

RewriteEngine On

# Don't rewrite files
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# If the ALPHA_USER cookie is set, serve the uncompressed files
RewriteCond %{HTTP_COOKIE} ALPHA_USER [NC]
RewriteRule ^ index.html [L]

# Rewrite everything
RewriteRule ^ dist/index.html [L]

Вы заметите две вещи:

  • Я удалил RewriteCond %{REQUEST_FILENAME} -d, поскольку, скорее всего, вам не нужно обслуживать целые каталоги

  • Я добавил файл cookie ALPHA_USER, который перенаправляет пользователей в несжатые файлы. Этот файл cookie может иметь любое значение, которое вы хотите.

Ответ 2

Внутри public_html =>/app =>.htaccess попробуйте следующее:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ dist/index.html [L]

Примечание. Тег HTML <base> должен указывать на папку dist. Я надеюсь, что это решение будет работать в соответствии с вашими ожиданиями.