Apache 2.4 — как ограничить трафик (по IP-адресу) для всех запросов, кроме базового пути?

Apache 2.4 — как ограничить трафик (по IP-адресу) для всех запросов, кроме базового пути?

У меня есть коллекция отладочных скриптов, которые /var/wwwотображают полезную информацию, помогающую исследовать проблемы на сервере, однако эта информация потенциально конфиденциальна, поэтому я не хочу, чтобы она была доступна публично.

Это , DocumentRootкоторый /var/www/выглядит так:

$ ls -1 /var/www/
apc.php
index.php
linux-dash
opcache.php
phpinfo.php

Чтобы защитить эту информацию, я пытаюсь настроить Apache так, чтобы он принимал запросы только с моего IP-адреса (который в данном примере равен 192.168.33.1).

Сложность в том, что я хочу, чтобы запросы на www.example.comи www.example.com/index.phpотвечали кодом 200 независимо от того, с какого IP они исходят.

На данный момент моя status.confконфигурация виртуального хоста выглядит так:

ServerName      www.example.com

<VirtualHost *:80>
    ServerName      www.example.com

    DocumentRoot    /var/www
    <Directory      /var/www>
        Options FollowSymLinks
        AllowOverride All
        Require ip 192.168.33.1
    </Directory>

    <LocationMatch ^/(index.php)?$>
        Require all granted
    </LocationMatch>

    <Location /server-status>
        SetHandler server-status
    </Location>
</VirtualHost>

Это работает частично, так как позволяет отвечать на 200запросы с любого запрашиваемого IP-адреса www.example.comс www.example.com/index.phpпомощью , однако на все остальные запросы он неправильно отвечает с помощью , 403даже если они запрошены с IP-адреса из белого списка:

$ curl -I -H 'Host: www.example.com' 192.168.33.10
HTTP/1.1 200 OK

$ curl -I -H 'Host: www.example.com' 192.168.33.10/index.php
HTTP/1.1 200 OK

$ curl -I -H 'Host: www.example.com' 192.168.33.10/phpinfo.php
HTTP/1.1 403 Forbidden

$ curl -I -H 'Host: www.example.com' 192.168.33.10/opcache.php
HTTP/1.1 403 Forbidden

$ curl -I -H 'Host: www.example.com' 192.168.33.10/server-status
HTTP/1.1 403 Forbidden

От access.log:

192.168.33.1 - - [15/Jun/2015:09:59:13 +0000] "HEAD / HTTP/1.1" 200 148 "-" "curl/7.37.1"
192.168.33.1 - - [15/Jun/2015:09:59:32 +0000] "HEAD /index.php HTTP/1.1" 200 148 "-" "curl/7.37.1"
192.168.33.1 - - [15/Jun/2015:09:59:47 +0000] "HEAD /phpinfo.php HTTP/1.1" 403 139 "-" "curl/7.37.1"
192.168.33.1 - - [15/Jun/2015:10:00:03 +0000] "HEAD /opcache.php HTTP/1.1" 403 139 "-" "curl/7.37.1"
192.168.33.1 - - [15/Jun/2015:10:00:22 +0000] "HEAD /server-status HTTP/1.1" 403 139 "-" "curl/7.37.1"

Какие изменения мне необходимо внести в конфигурацию Apache, чтобы добиться желаемого поведения?

решение1

Ваша конфигурация выглядит хорошо — попробуйте перезагрузить Apache на случай, если какие-то изменения конфигурации не вступили в силу.

решение2

Это потому, что вы вставляете LocationMatchтолько for index.php. LocationMatchможно определить как регулярное выражение, поэтому вы можете попробовать добавить регулярное выражение для всех файлов, которые вам понадобятся.

Что-то вроде:

<LocationMatch ^/(index.php|phpinfo.php|opcache.php)?$>
        Require all granted
</LocationMatch>

Связанный контент