Como dizer ao .htaccess para permitir apenas solicitações para a pasta index.php e app/dist/*?

Como dizer ao .htaccess para permitir apenas solicitações para a pasta index.php e app/dist/*?

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 distpasta 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 .htaccesssintaxe?

Eu tenho essa configuração, que me permite acessar o arquivo index.php. Mas nenhuma pista para conseguir isso para a distpasta ...

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ê .htaccesspode usar mod_rewrite para restringir o acesso a qualquer coisa diferente de /index.phpou /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.phpou não seja iniciada /app/dist/. Se você deseja retornar um 404, mude Fpara 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 RewriteRulediretiva 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.phpopcional.

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.phpou 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 ALLOWEDenv var se qualquer um dos caminhos de URL permitidos for solicitado. A Requirediretiva 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, oAliasdiretiva (de preferência no arquivo de configuração do servidor principal ou se você preferir um .htaccessarquivo 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.comcomo DocumentRootforwww.exemplo.com.
Pode .htaccessentã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 AlaisMatchdiretiva.

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 ENDbandeira após cada partida. Este sinalizador é necessário para simular a if-elsesintaxe típica. Mas não está documentado nos documentos oficiais.

Finalmente mudei para o Node.js.

informação relacionada