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

Блоки местоположения Nginx не применяются к файлам .php внутри них?

Поэтому, чтобы помочь предотвратить атаки методом грубой силы на мою установку phpmyadmin, я настроил nginx на требование HTTP Basic Auth (дополнительное имя пользователя и пароль), а затем запросы должны поступать с IP-адреса из белого списка. Однако белый список IP-адресов работает нормально, если я запускаю https://example.com/phpmyadmin/ однако без добавления дополнительного блока .php я мог загрузить https://example.com/phpmyadmin/index.php без моего IP-адреса в белом списке. Эта проблема не влияет на базовую аутентификацию HTTP. Есть ли причина, по которой это происходит? В любом случае, чтобы обойти необходимость добавления дополнительных блоков .php? Копия области конфигурации для phpmyadmin находится ниже.

# Setup and secure phpMyAdmin
location /phpmyadmin/ {
  allow 1.2.3.4;
  deny all;
  auth_basic "phpMyAdmin - HTTP Basic Login";
      auth_basic_user_file /etc/nginx/pma_pass;
    location ~ \.php$ {
    include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    allow 1.2.3.4;
    deny all;
    }
}

В большинстве конфигураций PHP есть один location ~ \.php$ блок, который обрабатывает любой URI, заканчивающийся на .php, поэтому добавление ограничений к другим location блоки будут влиять только на задействованные статические файлы. Видеть этот документ для большего.

Самым чистым решением является использование префикса местоположения с ^~ модификатор, который гарантирует, что все URI, начинающиеся с /phpmyadmin/ обрабатываются этим блоком, а другие locations на верхнем уровне не обходите вашу безопасность. Видеть этот документ для большего.

Как вы обнаружили, вам нужно будет добавить вложенный location для обработки PHP в этом блоке, но все операторы аутентификации должны быть унаследованы и не должны повторяться во внутреннем блоке.

Например:

location ^~ /phpmyadmin/ {
    allow 1.2.3.4;
    deny all;
    auth_basic "phpMyAdmin - HTTP Basic Login";
    auth_basic_user_file /etc/nginx/pma_pass;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}