Der einfachste Weg wäre, zunächst den gesamten Zugriff zu verweigern und dann nur den gewünschten Verzeichnissen Zugriff zu gewähren. Wie ring0 betonte, können Sie das Standard-Flag (default_server in 0.8) in der Listen-Direktive verwenden. Wenn Sie jedoch bereits einen Server haben, den Sie als Standard für unbekannten benannten Zugriff auf Ihren Host verwenden möchten, können Sie auch einfach Anfragen ohne Host-Header oder mit der IP-Adresse Ihres Servers mit so etwas abfangen (ersetzen Sie 1.2.3.4 durch Ihre Server-IP:
upstream _php {
server unix:/var/run/php-fpm/php-fpm.sock;
}
server {
server_name "" 1.2.3.4;
root /path/to/root;
index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# deny everything that doesn't match another location
location / { deny all; }
# allow loading /index.php
location = / { } # need to allow GET / to internally redirect to /index.php
location = /index.php { fastcgi_pass _php; }
# allow access to phpmyadmin
location /phpmyadmin/ { } # Allow access to static files in /phpmyadmin/
location ~ ^/phpmyadmin/.*\.php$ { fastcgi_pass _php; } # phpmyadmin php files
}
die fastcgi_params werden von beiden Orten geerbt, die fastcgi_pass, und nur /index.php und /phpmyadmin/ sind erlaubt. Ich habe auch einen Upstream-Block für PHP hinzugefügt, was es einfacher macht, falls Sie jemals etwas hinzufügen oder in Zukunft ändern müssen.
Kreative Nutzung der in Regex negierten Location- und Deny-Regeln, etwa so:
location / {
root html;
index index.html index.htm index.php;
}
location ~* !^/(index.(php|html|htm)$)|(phpmyadmin/) {
deny all;
}
location ~ \.php$ {
root html;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/http/nginx/$fastcgi_script_name;
include fastcgi_params;
}
Das ist ungetestet, aber Sie verstehen schon.
http://wiki.nginx.org/HttpAccessModule
http://wiki.nginx.org/HttpCoreModule#location
Auch dies kann Ihnen beim Schreiben helfen:
http://www.regextester.com/