Apache 2 - Redirecionar namespace específico para index.html do SPA

Apache 2 - Redirecionar namespace específico para index.html do SPA

Eu tenho um Angular 10-SPA que sirvo a partir de um servidor HTTP Apache 2.4.29, e muito pouca experiência real com servidores HTTP em geral impede que este execute e sirva um servidor de aplicativos WSGI no passado. Como esse servidor HTTP também atende meu backend (um servidor de aplicação Django via WSGI que se conecta via Django-Rest-Framework ao meu banco de dados), meu SPA não é o destinatário de todas as solicitações que chegam, apenas daquelas que começam com um determinado prefixo, por exemplo www.mypage.com/prefix/. Tenho tentado configurá-lo para que essencialmente todos os URLs que possuem isso /prefixdiretamente após o domínio ser servido, meus SPAs index.htmlestão localizados em frontendfolder, o que esperançosamente começa imediatamente a construir a página para essa rota específica.

Eu li através doDocumentação angularsobre implantação com apache2 e a documentação do apache2RewriteRuleeReescreverConddiretivas. Isso é o que tenho em meus sites-available/mypage.conf. Tudo na tag Directory é um copypaste modificado de 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>

Isso me permite carregar pelo menos meu index.html quando estou no meu mypage.com/prefixURL. Se eu acessar mypage.com/prefix/page1 e clicar em atualizar, recebo "404 Not Found" do Apache.

O que há de errado com minha configuração? Tive a impressão de que isso RewriteRule ^/prefix /index.htmlencaminharia tudo o que começa com /prefix para meu index.html, a menos que esse URL levasse a um arquivo válido, então por que isso não está acontecendo?

Responder1

Sua configuração parece - por favor, me perdoe - confusa.

Correto,DocumentRootnão é um erro de digitação. É uma diretiva básica do Apache, que mapeia o espaço da URL em seu sistema de arquivos. Portanto, ele informa ao Apache onde responder às solicitações, exceto onde você o substitui por Alias, RewriteRule ou qualquer outra coisa.

Não sei exatamente qual mapeamento de espaço de URL você está tentando alcançar. Meu melhor conselho é começar removendo todas as diretivas Aliase RewriteRule, deixando apenas o DocumentRoot. Em seguida, veja se isso fornece o mapeamento de URL desejado. Por exemplo, com apenas

DocumentRoot /path/to/frontendfolder

então as solicitações example.com/prefixserão roteadas /path/to/frontendfolder/prefixem seu sistema de arquivos. Se for um diretório e contiver, por exemplo, um arquivo index.html, a solicitação será respondida por /path/to/frontendfolder/prefix/index.html.

Esse é o ponto de partida. Se não atender às suas necessidades, você poderá começar a substituí-lo onde for necessário, comAliase diretivas RewriteRule. Alias ​​é mais simples e fundamental, então tente usá-lo primeiro e recorra ao RewriteRule para necessidades mais complexas.

Boa sorte!

Aliás, embora a documentação do RewriteCond mencione DOCUMENT_ROOT, ela não diz qual é o seu valor. Mas podemos assumir que é o valor da diretiva DocumentRoot.

informação relacionada