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 /prefix
diretamente após o domínio ser servido, meus SPAs index.html
estã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/prefix
URL. 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.html
encaminharia 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 Alias
e 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/prefix
serão roteadas /path/to/frontendfolder/prefix
em 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.