最も簡単な方法は、最初にすべてのアクセスを拒否してから、必要なディレクトリへのアクセスのみを許可することです。 ring0 が指摘したように、リッスン ディレクティブでデフォルト (0.8 の default_server) フラグを使用できます。ただし、ホストへの未知の名前付きアクセスのデフォルトとして使用するサーバーが既にある場合は、ホストヘッダーなしで、またはサーバーの IP アドレスを使用して、次のようなものでリクエストをキャッチすることもできます (1.2.3.4 をサーバーの 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
}
fastcgi_params は fastcgi_pass の両方の場所に継承され、/index.php と /phpmyadmin/ のみが許可されます。また、php のアップストリーム ブロックも追加しました。これにより、将来追加または変更する必要が生じた場合に簡単になります。
次のような正規表現で否定された場所と拒否ルールの創造的な使用:
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;
}
これはテストされていませんが、アイデアはわかります。
http://wiki.nginx.org/HttpAccessModule
http://wiki.nginx.org/HttpCoreModule#location
また、これはあなたがそれを書くのを助けるかもしれません:
http://www.regextester.com/