Dies ist der aktuelle Ordner:
/app
/dist
/index.html
/index.css
/index.js
/src
/configurations.json
/index.php
/configurations.php
Ich habe überall sensible Daten:
app/src/...
/...
Ich möchte, dass die Benutzer nur auf Folgendes zugreifen können:
index.php
app/dist/whateverfile.whateverformat
Der dist
Ordner kann sich ändern, daher muss ich ihnen den Zugriff auf dieses Verzeichnis statisch ermöglichen, damit ich nicht jede einzelne Datei auflisten muss.
.htaccess
Wie soll das mit dieser Syntax geschehen ?
Ich habe diese Konfiguration, die mir den Zugriff ermöglicht index.php
. Aber keine Ahnung, wie ich das für den dist
Ordner erreichen kann ...
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>
Dank im Voraus.
Antwort1
Die <Files>
und <FilesMatch>
-Richtlinien zielen nurDateien, keine Verzeichnisse. Wenn Sie Zugriff auf die Serverkonfiguration haben, verwenden Sie möglicherweise einen <Directory>
Container.
Verwenden von mod_rewrite
In .htaccess
können Sie mod_rewrite verwenden, um den Zugriff auf alles andere als /index.php
oder einzuschränken /app/dist/
.
Zum Beispiel:
RewriteEngine On
RewriteRule !^(index\.php$|app/dist/) - [F]
Das Obige antwortet mit einer 403-Forbidden-Meldung für alle Anfragen, die nicht /index.php
gestartet werden oder werden /app/dist/
. Wenn Sie stattdessen eine 404-Meldung zurückgeben möchten, ändern Sie diese F
in R=404
.
Das !
Präfix des regulären Ausdrucks negiert den regulären Ausdruck. Beachten Sie, dass der URL-Pfad, der mit demRewriteRule
Musterbeginnt nicht mit einem Schrägstrich.
Wenn Sie nur mit einer 403-Antwort auf Anfragen antworten möchten, die auf tatsächliche Dateien oder Verzeichnisse verweisen (und andernfalls mit 404), fügen Sie einige Bedingungen hinzu, die das Dateisystem prüfen (beachten Sie jedoch, dass Dateisystemprüfungen relativ teuer sind. Verwenden Sie sie daher nicht, wenn Sie sie nicht benötigen). Beispiel:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(index\.php$|app/dist/) - [F]
Nur wenn die angeforderte URL nicht in der erlaubten „Gruppe“ istUndwird einer Datei oder einem Verzeichnis zugeordnet, wenn die RewriteRule
Direktive ausgeführt wird.
Ich würde jedoch davon ausgehen, dass Ihre URLs tatsächlich nicht enthalten index.php
(oder doch?). In diesem Fall fordert der Benutzer an /
und mod_dir stellt eine interne Unteranforderung für /index.php
(das DirectoryIndex
). In diesem Fall müssen Sie das index.php
optional machen.
Zum Beispiel:
RewriteRule !^((index\.php)?$|app/dist/) - [F]
Verwenden eines Apache-Ausdrucks
Alternativ können Sie dies mit einem Apache-Ausdruck tun (Apache 2.4).
<If "%{REQUEST_URI} !~ m#^/((index\.php)?$|app/dist/)#">
Require all denied
</If>
Das Obige antwortet mit einer 403 für jede URL-Anfrage, die nicht ist /
oder /index.php
mit beginnt /app/dist/
.
Beachten Sie, dass Order
, Allow
, Deny
, usw. ältere Apache 2.2-Direktiven sind und in Apache 2.4 offiziell veraltet sind.
Verwenden von mod_setenvif
Eine andere Alternative besteht darin, mod_setenvif zu verwenden und eine Umgebungsvariable festzulegen, wenn einer der zulässigen URL-Pfade angefordert wird, und den Zugriff nur zuzulassen, wenn diese Umgebungsvariable festgelegt ist.
Zum Beispiel:
SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED
Das Obige setzt die ALLOWED
Umgebungsvariable, wenn einer der zulässigen URL-Pfade angefordert wird. Die Require
Direktive erfordert dann, dass diese Umgebungsvariable gesetzt wird, um Zugriff zu gewähren, andernfalls wird eine 403 zurückgegeben.
Antwort2
Wenn dies Ihr Hauptproblem ist:„Ich habe überall sensible Daten“
Dies lässt sich am einfachsten und zuverlässigsten lösen, indem Sie den sensiblen Bereich an einen Ort außerhalb Ihres Web-Stammverzeichnisses verschieben ...
Stellen Sie sich ein Web-Stammverzeichnis (Ihr DocumentRoot
) vor, das nur Folgendes enthält: index.php
Wenn sich dort keine anderen Daten befinden, benötigen Sie auch keine komplexen Regeln, um diese zu schützen …
Sie können dann beispielsweise dieAlias
Direktive (vorzugsweise in Ihrer Hauptserverkonfigurationsdatei oder, wenn Sie es vorziehen, in einer .htaccess
Datei in Ihrem Webstamm) oder Mod_rewrite-Regeln, um URIs Dokumenten zuzuordnen, die in Verzeichnissen außerhalb Ihrer DocumentRoot-Verzeichnisse/-Dateien gespeichert sind, um den Zugriff ausdrücklich zu erlauben.
dh
.
`-- some-path
|-- app
| `-- dist
| |-- index.css
| |-- index.html
| `-- index.js
|-- src
| `-- configurations.json
`-- www.example.com
|-- .htaccess
`-- index.php
Wobei Ihre Haupt-Apache-Konfiguration /some-path/www.example.com
als DocumentRoot
für definiertwww.beispiel.com.
Das .htaccess
kann dann etwas sein wie: Dies stellt das Verzeichnis /some-path/app/ und seinen gesamten Inhalt als URI-Pfad bereithttp://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"
Alias "/app/dist" "/some-path/app/dist"
Oder seien Sie mit einem regulären Ausdruck in einer Direktive spezifischer bzw. kreativer AlaisMatch
.
Antwort3
Das ist wie:
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]
Beachten Sie das END
Flag nach jeder Übereinstimmung. Dieses Flag ist erforderlich, um die typische if-else
Syntax zu simulieren. Es ist jedoch nicht in den offiziellen Dokumenten dokumentiert.
Ich bin endlich zu Node.js gewechselt.