Блоки местоположения 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;
    }
}

1 ответ

Решение

В большинстве конфигураций 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;
    }
}
Другие вопросы по тегам