Назад | Перейти на главную страницу

Установите nginx.conf на запрет всех подключений, кроме определенных файлов или каталогов.

Я пытаюсь настроить 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

Кроме того, это может помочь вам написать это:

http://www.regextester.com/

Проще заявить серверы которые вызываются с доменным именем, и объявляют дефолт сервер, который будет включать прямой доступ по 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;
    }