Estou tentando criar um host virtual Apache fechado para todos os endereços IP, com exceção de um endereço IP e dois URLs que devem ser acessíveis publicamente.
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAdmin [email protected]
DocumentRoot "/var/www/example.com/app/webroot"
<Directory "/var/www/example.com/app/webroot">
Options FollowSymLinks Includes ExecCGI
AllowOverride All
ErrorDocument 403 "https://example.com/403.php"
DirectoryIndex index.php
</Directory>
<Location "/foo/bar/">
Require all granted
</Location>
<Location "/.well-known/">
Require all granted
</Location>
<Location "/">
Require ip 1.2.3.4
</Location>
SSLProxyEngine on
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /api/ https://host.docker.internal:8443/api/ connectiontimeout=5 timeout=300
ProxyPassReverse /api/ https://host.docker.internal:8443/api/
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Tentei alterar a ordem das Location
tags, mas todas as solicitações são redirecionadas para ErrorDocument
o valor da diretiva.
O URL /foo/bar/
é reescrito por .htaccess
localizado em DocumentRoot
(para fins de teste, tentei remover .htaccess
sem efeito).
Versão Apache:
- Versão do servidor: Apache/2.4.59 (Debian)
- Servidor construído: 2024-04-05T12:02:26
O Apache é executado em um contêiner Docker, mas provavelmente não tem significado para o problema.
P: O que há de errado com a configuração?
Ordem errada das
Location
seçõesDe acordo com a documentação oficial do Apache 2.4 ,
<Location>
as seções são processadas na ordem em que aparecem no arquivo de configuração, após a leitura das<Directory>
seções e arquivos e após a leitura das seções..htaccess
<Files>
O
Require ip 1.2.3.4
na<Location "/">
seção restringe o acesso apenas a esse IP, mas as outras<Location>
seções devem substituir isso para os caminhos específicos. A ordem correta deve ser:Location
com barra final/
Outro problema pode ser a barra
/
que você tem no final do local especificado. De acordo com a documentação oficial do Apache 2.4 , as diretivas anexas serão aplicadas à solicitação se o componente do caminho da URL atender a qualquer um dos seguintes critérios:No exemplo abaixo, onde nenhuma barra final é usada, as solicitações para e
/private1
terão as diretivas incluídas aplicadas, mas não o fariam./private1/
/private1/file.txt
/private1other
No exemplo abaixo, onde uma barra final é usada, as solicitações para
/private2/
e/private2/file.txt
terão as diretivas incluídas aplicadas, mas/private2
e/private2other
não.Houve dois problemas na minha configuração:
Como @sotirov mencionou ,
<Location>
as tags são processadas por ordem de presença - a ordem correta deve ser: restringir todo o acesso a determinados endereços IP e, seguindo<Location>
as tags, permitir o acesso a locais especificados.URLS reescritos - meu URL
/foo/bar/
foi reescrito em.htaccess
eindex.php
, nesta situação, o URL não corresponde ao<Location "/foo/bar/">
local. Quando uso<Location "/foo.bar">
a tag de localização de arquivo físico real, funciona conforme o esperado.