У меня есть Angular 10-SPA, который я обслуживаю с HTTP-сервера Apache 2.4.29, и очень мало фактического опыта работы с HTTP-серверами в целом, за исключением того, что я запустил его и обслуживал сервер приложений WSGI в прошлом. Поскольку этот HTTP-сервер также обслуживает мой Backend (сервер приложений Django через WSGI, который подключается через Django-Rest-Framework к моей базе данных), мой SPA не является получателем всех входящих запросов, а только тех, которые начинаются с заданного префикса, например www.mypage.com/prefix/
. Я пытался настроить его так, чтобы по сути каждый URL, который имеет это /prefix
непосредственно после домена, обслуживался моими SPA, index.html
расположенными в frontendfolder
, который, как я надеюсь, затем немедленно начинает строить страницу для этого конкретного маршрута.
Я прочитал(а)Угловая документацияо развертывании с помощью apache2 и документации apache2RewriteRuleиПереписатьУсловиедирективы. Вот что у меня в sites-available/mypage.conf. Все в теге Directory — это измененная копипаст из angular.io:
DocumentRoot /path/to/frontendfolder
#DocumentRoot is not a typo, I'm not sure if DOCUMENT_ROOT calls that variable or not,
#but there is nothing else called like it in neither the mypage.conf file, nor
#apache2.conf, nor envvars
Alias /prefix /path/to/frontendfolder
Alias /prefix/ /path/to/frontendfolder/index.html
<Directory /path/to/frontendfolder>
Require all granted
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 ^/prefix - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^/prefix /index.html
</Directory>
Это позволяет мне загружать по крайней мере мой index.html, когда я нахожусь на своем mypage.com/prefix
URL. Если я захожу на mypage.com/prefix/page1 и нажимаю обновить, я получаю Apache "404 Not Found".
Что не так с моей конфигурацией? У меня было впечатление, что это RewriteRule ^/prefix /index.html
перенаправит все, что начинается с /prefix, в мой index.html, если только этот URL не ведет к действительному файлу, так почему же этого не происходит?
решение1
Ваша конфигурация кажется — простите меня — запутанной.
Правильный,DocumentRootне опечатка. Это базовая директива Apache, которая отображает пространство URL в вашей файловой системе. Таким образом, она сообщает Apache, куда идти для ответа на запросы, за исключением случаев, когда вы переопределяете это с помощью Alias, RewriteRule или чего-то еще.
Я не уверен, какое именно отображение пространства URL вы пытаетесь получить. Мой лучший совет — начать с удаления всех директив Alias
и RewriteRule
, оставив только DocumentRoot
. Затем посмотрите, даст ли это вам нужное отображение URL. Например, с помощью только
DocumentRoot /path/to/frontendfolder
то запросы example.com/prefix
будут перенаправлены /path/to/frontendfolder/prefix
в вашу файловую систему. Если это каталог, и если он содержит, например, файл index.html, то на запрос будет дан ответ /path/to/frontendfolder/prefix/index.html
.
Это отправная точка. Если это не соответствует вашим потребностям, то вы можете начать переопределять это там, где вам нужно, с помощьюПсевдоними директивы RewriteRule. Alias проще и фундаментальнее, поэтому попробуйте сначала использовать его, а затем возвращайтесь к RewriteRule для более сложных нужд.
Удачи!
Кстати, хотя документация по RewriteCond упоминает DOCUMENT_ROOT
, она не говорит, каково его значение. Но мы можем предположить, что это значение директивы DocumentRoot.