Я пытаюсь настроить Nginx так, чтобы все подключения к моему числовому IP-адресу были запрещены, за исключением нескольких произвольных каталогов и файлов. Поэтому, если кто-то перейдет на мой IP-адрес, им будет разрешен доступ к файлу index.php и, например, к каталогу phpmyadmin, но если они попытаются получить доступ к любым другим каталогам, им будет отказано.
Это мой серверный блок от nginx.conf
:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm index.php;
}
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;
}
}
Как мне поступить? Огромное спасибо!
Самый простой путь - начать с запрета любого доступа, а затем предоставить доступ только тем каталогам, которые вам нужны. Как указал ring0, вы можете использовать флаг по умолчанию (default_server в 0.8) в директиве прослушивания. Однако, если у вас уже есть сервер, который вы хотите использовать по умолчанию для доступа с неизвестными именами к вашему хосту, вы также можете просто перехватывать запросы без заголовка хоста или с 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
Кроме того, это может помочь вам написать это:
Проще заявить серверы которые вызываются с доменным именем, и объявляют дефолт сервер, который будет включать прямой доступ по IP.
Например, конфигурация вашего домена может использоваться, скажем, для mydomain.com
server {
listen 80;
server_name mydomain.com *.mydomain.com;
root /var/www/html/mydomain.com
...
Наличие ваших обычных файлов в каталоге /var/www/html/mydomain.com
.
А запись по умолчанию разрешает доступ только к некоторым конкретным файлам в другом месте.
Обратите внимание дефолт ключевое слово после listen 80
.
server {
listen 80 default;
server_name _ *;
root /var/www/html/restricted
...
И вы помещаете файлы по умолчанию в /var/www/html/restricted
, который будет обслуживаться localhost и необработанные IP-адреса.
Вы можете установить напрямую весь путь к index.php и установить только в этом файле fastcgi php7 для nginx
//redirect all to index.php
location / {
autoindex off;
set $redirect_url $uri;
try_files $uri $uri/ /index.php$is_args$query_string;
}
location = /index.php {
include fastcgi.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
//Extra Params script PHP
fastcgi_param PATH_INFO $redirect_url;
fastcgi_param HTTP_HOST $server_name;
}