Экземпляр Amazon Linux 2 использует Apache для размещения приложения Angular 7. Приложение Angular 7 включает в себя не только index.html
, но также несколько файлов .js
и подкаталог с именем assets
.
Какой конкретный синтаксис мне нужно использовать, чтобы запросы к Apache для всех неуказанных маршрутов перенаправлялись на
index.html
, расположенный вDocumentRoot
? Обратите внимание, что необходимый синтаксис также должен позволять всем файлам.js
и содержимому каталогаassets
обслуживаться в качестве вторичных запросов при загрузке клиентских браузеровindex.html
.
Например, если удаленный веб-браузер запрашивает mydomain.com/randomCharacters
, я хочу, чтобы Apache возвращал index.html
так же, как Apache ответил бы на запрос mydomain.com
с index.html
. Затем index.html
должен иметь доступ к файлам .js
и содержимому подкаталога assets
.
(В данном случае DocumentRoot
— это каталог с именем /var/www/mydomain.com/public_html
.Кроме того, каталог /var/www/mydomain.com/public_html
содержит 1. index.html
, 2. несколько файлов .js
и 3. assets
подкаталог, содержащий такие вещи, как изображения и т. д.)
Я хотел бы использовать RedirectMatch
внутри блока VirtualHost
, чтобы сохранить конфигурацию как можно более чистой. . Вот что я имею в виду. Как нужно изменить следующее?
ServerName www.mydomain.com
ServerAlias mydomain.com
DocumentRoot /var/www/mydomain.com/public_html
ErrorLog /var/www/mydomain.com/error.log
CustomLog /var/www/mydomain.com/requests.log combined
RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com
При выполнении описанного выше действия с открытой вкладкой «Сеть» в инструментах разработчика Firefox и отправкой запроса на http://mydomain.com
, в то время как RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com
находится в VirtualHost
, в результате все запросы к /
показано, что они дали 304
ответов, в то время как все запросы к именованным файлам, таким как скрипты и таблицы стилей, дали 302
ответов.
Кроме того, когда я просматриваю исходный код страницы html
для того же запроса, я вижу, что содержимое index.html
действительно было обработано правильно, но браузер оставался пустым, потому что код в index.html
не смог получить доступ к файлам .js
или содержимому подкаталога assets
.
Итак, проблема в том, что
RedirectMatch 302 ^/(?!index.html$).+ http://mydomain.com
необходимо переписать, чтобы разрешить.js
и содержимое подкаталогаassets
. Какой конкретный синтаксис требуется для решения этой проблемы, чтобы Apache мог успешно серверировать приложение Angular 7 независимо от того, какая строка символов добавляется после http://mydomain.com?
Вы можете использовать подобное RewriteRule
в контексте VirtualHost
:
RewriteEngine On
# if not a regular file
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
# and not a directory
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
# then rewrite to index.html
RewriteRule ^.*$ /index.html [L]
Если вы хотите, чтобы ваша конфигурация была «как можно более чистой», тогда не делайте ничего подобного и позвольте Apache вернуть HTTP 404, как и должно быть.