2015-07-27 2 views
1

Я задавал подобный вопрос перед Restrict access to directories through ip addressЗапретить доступ к файлам через IP-адрес - апач 2,4

в то время эта проблема была решена для апача 2.2. Недавно я снова установил ОС (в Debian 8), и он поставляется с apache 2.4.

Я хочу ограничить доступ к файлам - когда запрос приходит "по" IP. В основном, если в браузере я пытаюсь открыть http://192.168.252.178/test/image.jpg, он должен показать ошибку - 403 запрещено. Каталог test находится в www каталоге apache. Однако я должен иметь доступ к этому изображению, если я нахожу http://www.example.com/image.jpg - учитывая, что example.com указывает на то, что test.

С апача версии 2.2, я бы просто поставить эти строки в моем умолчанию файл сайта конфигурации - и проблема была решена

<Files ~ ".+"> 
    Order allow,deny 
    Deny from all 
</Files> 

Теперь, пытаясь то же самое не работает: Я получаю 403 запрещен, даже если Я пытаюсь открыть любой сайт по доменному имени.

Учитывая изменения в 2.4, я также пробовал это, но снова получал тот же 403, который запрещался при попытке открыть какой-либо сайт.

<Files ~ ".+"> 
     Require all denied 
</Files> 

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

<Directory /home/username/www> 
     Options -Indexes 
     AllowOverride All 
     Require all granted 
</Directory> 

Итак, вопрос в том, как предотвратить доступ к файлам через IP-адрес. Также мне нужно достичь этого с помощью apache config, на htaccess не является решением для меня. И мне нужно добиться этого для всех каталогов/файлов внутри www рекурсивно, поэтому определение точных имен файлов и/или каталогов также не является решением.

Благодаря

+0

Вы используете Apache [имя на основе VirtualHosts] (https://httpd.apache.org/docs/2.4/en/vhosts/)? Мне кажется, они идеально подходят для решения вашей проблемы: один VHost на сайт ('site1',' site2', ...) и один «catchall», который ловит все остальные запросы, поэтому запрос, сделанный на IP-адрес адрес тоже. Вы можете определить другой DocRoot для каждого из этих сайтов и очень легко закрыть все запросы на IP-адрес. – Zimmi

+0

@ Zimmi, спасибо за комментарий, да на самом деле у меня есть несколько доменов на ip, но не могли бы вы разместить пример того, что вы имеете в виду? спасибо – dav

ответ

1

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

Если виртуальный хост не найден, тогда будет выбран первый VHost в этом подмножестве (также в порядке конфигурации). More.

Я говорю об этом, потому что это будет важно у вас есть только один тип директивы VirtualHost:

<VirutalHost *:80> 

или

<VirtualHost 123.45.67.89:80> 

Я буду использовать подстановочные знаки в примере. Вам нужен каталог, например/var/www/catchall, с файлом index.html или аналогичным, как вы предпочитаете.

<VirtualHost *:80> 
    # This first-listed virtual host is also the default for *:80 
    # It will be used as the catchall. 

    ServerName 123.45.67.89 

    # Giving this DocRoot will avoid any request based on IP or any other 
    # wrong request to get to the other users directories. 

    DocumentRoot "/var/www/catchall" 

    <Directory /var/www/catchall> 
     ... 
    </Directory> 
</VirtualHost> 

# Now you can add as usuall the configuration for any other VHost you need. 
<VirtualHost *:80> 
    ServerName site1.com 
    ServerAlias www.site2.com 

    DocumentRoot "/home/username1/www" 
    <Directory /home/username1/www> 
     ... 
    </Directory> 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName site2.com 
    ServerAlias www.site2.com 

    DocumentRoot "/home/username2/www" 
    <Directory /home/username2/www> 
     ... 
    </Directory> 
</VirtualHost> 

Debian конкретны:

Для Debian, вы в идеале поставить одну конфигурацию ВХост в файл и поместить файл в каталоге /etc/apache2/sites-available. Назовите файлы по своему усмотрению, только файл, содержащий хост-хост, должен иметь имя 000-catchall, потому что они будут прочитаны в алфавитном порядке из каталога /etc/apache2/sites-enabled.

Затем отключить обычный сайт по умолчанию в Debian:

a2dissite 000-default 

и включить новый сайт приема всей и другие ВХосты при необходимости:

a2ensite 000-catchall 

ls /etc/apache2/sites-enabled команда должна показать Catchall как первый списка, если не изменить его имя файла, чтобы он всегда был первым. Restart Apache: service apache2 restart

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

+0

Есть ли способ сделать это без явного информирования ip-адреса в 'ServerName 123.45.67.89'? Этот ip может время от времени меняться, и мне всегда нужно будет изменить catch. – Gustavo

+0

@ Gustavo Второй абзац ответа объясняет, как выбирается виртуальный хост, см. Также ссылку. Если Apache не находит соответствующего VirtualHost на основе ServerName/ServerAlias, он выбирает первый VHost из конфигурации. Таким образом, ваш общий VHost должен быть первым в config, отсюда и название '000-catchall'. Тогда имя сервера catchall больше не имеет значения. Также должно быть возможно использовать имя хоста вашего компьютера, например «ServerName myserver» или что-то еще, вы можете проверить его – Zimmi

+0

Я получаю его сейчас. Не могли бы вы взглянуть на этот вопрос (https://serverfault.com/questions/853107/why-is-apache-redirecting-me-when-i-access-using-ip-address)? – Gustavo

Смежные вопросы