Esta é a pasta atual:
/app
/dist
/index.html
/index.css
/index.js
/src
/configurations.json
/index.php
/configurations.php
Tenho dados confidenciais em todos os lugares:
app/src/...
/...
Quero que os usuários só possam acessar:
index.php
app/dist/whateverfile.whateverformat
A dist
pasta pode mudar, então tenho que permitir que eles acessem esse diretório estaticamente, para não precisar listar todos os arquivos.
Como isso deve ser feito com esta .htaccess
sintaxe?
Eu tenho essa configuração, que me permite acessar o arquivo index.php
. Mas nenhuma pista para conseguir isso para a dist
pasta ...
Options -Indexes
DirectoryIndex index.php
<FilesMatch ".*">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
<Files index.php>
Order allow,deny
Allow from all
Satisfy All
</Files>
<Files "">
Order allow,deny
Allow from all
Satisfy All
</Files>
Desde já, obrigado.
Responder1
As directivas <Files>
e <FilesMatch>
visam apenasarquivos, não diretórios. Se você tiver acesso à configuração do servidor, talvez use um <Directory>
contêiner.
Usando mod_rewrite
Você .htaccess
pode usar mod_rewrite para restringir o acesso a qualquer coisa diferente de /index.php
ou /app/dist/
.
Por exemplo:
RewriteEngine On
RewriteRule !^(index\.php$|app/dist/) - [F]
O acima responderá com 403 Forbidden para qualquer solicitação que não seja /index.php
ou não seja iniciada /app/dist/
. Se você deseja retornar um 404, mude F
para R=404
.
O !
prefixo no regex nega o regex. Observe que o caminho da URL correspondente aoRewriteRule
padrãonão começa com uma barra.
Se você quiser responder apenas com um 403 para solicitações que seriam mapeadas para arquivos ou diretórios reais (e 404 caso contrário), adicione algumas condições que verificam o sistema de arquivos (mas observe que as verificações do sistema de arquivos são relativamente caras, a menos que você precise delas, não os use). Por exemplo:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(index\.php$|app/dist/) - [F]
Somente se a URL solicitada não estiver no "grupo" permitidoemapeia para um arquivo ou diretório é a RewriteRule
diretiva acionada.
No entanto, eu diria que seus URLs não contêm realmente index.php
(contêm?); nesse caso, o usuário solicita /
e mod_dir emite uma subsolicitação interna para /index.php
(o DirectoryIndex
). Nesse caso, você precisará tornar o index.php
opcional.
Por exemplo:
RewriteRule !^((index\.php)?$|app/dist/) - [F]
Usando uma expressão Apache
Alternativamente, você pode fazer isso com uma expressão Apache (Apache 2.4)
<If "%{REQUEST_URI} !~ m#^/((index\.php)?$|app/dist/)#">
Require all denied
</If>
O texto acima responde com 403 para qualquer solicitação de URL que não seja /
, /index.php
ou comece com /app/dist/
.
Observe que Order
, Allow
, Deny
, etc. são diretivas mais antigas do Apache 2.2 e estão oficialmente obsoletas no Apache 2.4.
Usando mod_setenvif
Outra alternativa é usar mod_setenvif e definir uma variável de ambiente se um dos caminhos de URL permitidos for solicitado e permitir acesso apenas se esta variável de ambiente estiver definida.
Por exemplo:
SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED
O acima define o ALLOWED
env var se qualquer um dos caminhos de URL permitidos for solicitado. A Require
diretiva então exige que este env var seja definido para conceder acesso, caso contrário, um 403 será retornado.
Responder2
Se este for o seu principal problema:“Tenho dados confidenciais em todos os lugares”
Isso é resolvido de maneira mais fácil e confiável, movendo-o para algum lugar fora da raiz da web ...
Considere uma raiz da web (seu DocumentRoot
) que contém apenas index.php
Quando não há outros dados lá, você também não precisa de regras complexas para protegê-los ...
Você pode então usar, por exemplo, oAlias
diretiva (de preferência no arquivo de configuração do servidor principal ou se você preferir um .htaccess
arquivo na raiz da web) ou regras mod_rewrite para mapear URIs para documentos armazenados em diretórios fora de seus diretórios/arquivos DocumentRoot para permitir especificamente o acesso.
ou seja
.
`-- some-path
|-- app
| `-- dist
| |-- index.css
| |-- index.html
| `-- index.js
|-- src
| `-- configurations.json
`-- www.example.com
|-- .htaccess
`-- index.php
Onde sua configuração principal do apache define /some-path/www.example.com
como DocumentRoot
forwww.exemplo.com.
Pode .htaccess
então ser algo como isto expõe o diretório /some-path/app/ e todo o seu conteúdo como o caminho URIhttp://www.example.com/app/
# /some-path/www.example.com/.htaccess
# exposes/some-path/app/ directory as the URI path `http://www.example.com/app/`
Alias "/app" "/some-path/app"
Ou seja mais específico Alias "/app/dist" "/some-path/app/dist"
ou criativo com uma regex em uma AlaisMatch
diretiva.
Responder3
É assim:
Options -Indexes
ServerSignature Off
DirectoryIndex index.php
RewriteEngine on
RewriteRule ^ui(/)?$ app/dist/index.html [QSA,END,NC,L]
RewriteRule ui/(.*) app/dist/$1 [QSA,END,NC,L]
RewriteRule !(ui/.*) index.php [QSA,END,NC,L]
Observe a END
bandeira após cada partida. Este sinalizador é necessário para simular a if-else
sintaxe típica. Mas não está documentado nos documentos oficiais.
Finalmente mudei para o Node.js.