Apache 2 — перенаправить определенное пространство имен в index.html SPA

Apache 2 — перенаправить определенное пространство имен в index.html SPA

У меня есть 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/prefixURL. Если я захожу на 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.

Связанный контент