Meu aplicativo reside em um diretório e é servido a partir de uma public
pasta, e eu tenho um endpoint de API em um subdiretório de public, ambos redirecionados para seus respectivos arquivos index.php. Até uma migração de servidor recente, tudo estava funcionando muito bem. Agora, porém, as solicitações de API estão sendo interceptadas pelo diretório pai. Aqui estão os segmentos vhost <directory...>
em questão...
# application root
<Directory "/path/to/app">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# public root
<Directory /path/to/app/public>
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*\.(media.php|png|jpg|gif|ico)$ media.php [NC,L]
RewriteRule ^.*\.(xml|txt|css|js)$ static.php [NC,L]
RewriteRule ^.*$ index.php/ [NC,L]
errordocument 404 /error.php?id=404
</Directory>
# API
<Directory /path/to/app/public/api>
Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, HEAD, OPTIONS"
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
RewriteRule ^(.*)$ index.php [L,NC]
</Directory>
Estou usando o Apache 2.4.53. As /path/to/app/public
diretivas estão funcionando conforme o esperado, todas as extensões de arquivo de mídia são redirecionadas para media.php, todos os arquivos baseados em texto são redirecionados para static.php e todo o resto é enviado para index.php com um fallback de erro 404.
Se eu solicitar mydomain.com/api/
sozinho, recebo a mensagem de erro específica da API adequada, porque o ./api/
diretório existe fisicamente. Mas assim que solicito um endpoint adequado, como mydomain.com/api/v1.0/some-enddpoint/
o que deve ser capturado e redirecionado no ./api/index.php
arquivo, recebo um erro 404 que vem do diretório pai.
Agradeço qualquer ajuda!
Parece que seu
<Directory /path/to/app/public/api>
contêiner está herdando aRewriteBase
diretiva do<Directory /path/to/app/public>
contêiner pai. Isso acontecerá seRewriteOptions MergeBase
for definido, ou possivelmente outras opções relacionadas à herança .Parece que você não precisa da
RewriteBase /
diretiva no<Directory /path/to/app/public>
contêiner, portanto, basta removê-la. No entanto, verifique se você definiu isso em outro lugar na configuração.Como alternativa, defina um
RewriteBase /api
no<Directory /path/to/app/public/api>
contêiner. OU, prefixe a string de substituição com o caminho de URL completo, por exemplo:Eu também reduzi
^(.*)$
para simplesmente.
, já que você só precisa que isso seja processado para caminhos de URL não vazios e você deve usar oEND
sinalizador, em vez deL
evitar um loop desnecessário pelo mecanismo de reescrita. (ANC
bandeira também é supérflua.)Neste caso,
index.php
é provável que seja servido por mod_dir (DirectoryIndex
), não mod_rewrite.