У меня есть конфигурация виртуального хоста моего сервера Apache:
<VirtualHost *:80>
DocumentRoot "/app/www"
ServerName myhostname
<Directory "/app/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Я хочу разрешить доступ только к запросам с myhostname
в качестве имени хоста. Но я хочу отклонить все другие запросы, сделанные с помощью hostname или server-ip:
http://myhostiname/ ALLOW
http://1.2.3.4/ (this is one of the server ip addresses) DENY
Моя конфигурация виртуального хоста работает должным образом.
Теперь мне нужно отредактировать конфигурацию, чтобы позволить пользователю получить доступ к одному конкретному пути по ip, потому что клиент не может решить локальное имя хоста.
Это пример:
http://myhostiname ALLOW
http://1.2.3.4/ DENY
http://1.2.3.4/any/path DENY
http://1.2.3.4/allowed/path ALLOW
http://1.2.3.4/allowed/path/subpath ALLOW
Я пробовал элемент
на новом виртуальном хосте:
<VirtualHost 0.0.0.0:80>
DocumentRoot "/app/www"
<Directory "/app/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Location "/">
AllowOverride None
Order Deny,Allow
Deny from all
</Location>
<Location "^/allowed">
Allow from all
</Location>
</VirtualHost>
Но это отклоняет все, кроме запросов имени хоста. Что мне не хватает?
Я бы разделил вашу конфигурацию vhost на два или более vhosts. Все это можно сделать на одном виртуальном хосте, но я считаю, что "отдельные" конфигурации легче читать и регистрировать.
<VirtualHost *:80>
# default match for port 80
# matches domain set by ServerName (and possibly other domains unless specified in other vhosts)
ServerName myhostname
DocumentRoot "/app/www"
<Location "/">
# copied from your example. if not needed, you can remove this <Location/>-block.
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error-myhostname.log
CustomLog ${APACHE_LOG_DIR}/access-myhostname.log combined
</VirtualHost>
<VirtualHost 1.2.3.4:80>
# matches all requests to ip address and port
DocumentRoot "/app/www"
# initially: all requests forbidden
<Location "/">
# Options and AllowOverride copied from first vhost. remove if not needed.
Options Indexes FollowSymLinks
AllowOverride All
Require all denied
</Location>
# allow access to everything below "/allowed/path/"
<Location "/allowed/path/">
Require all granted
</Location>
# use separate logfile
ErrorLog ${APACHE_LOG_DIR}/error-1234.log
CustomLog ${APACHE_LOG_DIR}/access-1234.log combined
</VirtualHost>
<VirtualHost *:*>
# default match
# fallback for any other ports/ip addresses/domains we might have forgotten/misconfigured
DocumentRoot "/app/www"
# all requests forbidden
<Location "/">
Require all denied
</Location>
# again, use separate logfile
ErrorLog ${APACHE_LOG_DIR}/error-default.log
CustomLog ${APACHE_LOG_DIR}/access-default.log combined
</VirtualHost>