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

Apache configuration problem with <directory> и <location></location></directory>

Я столкнулся с довольно неприятной проблемой. У меня есть промежуточная система, к которой должны иметь доступ только наши клиенты и наша компания. Это делается с использованием следующей конфигурации:

<Directory "/srv/www/example.com">
    AllowOverride All
    Options FollowSymlinks -Indexes
    Order deny,allow
    Allow from 127.0.0.0/8 1.2.3.4 5.6.7.8
    # our IP
    Allow from 4.3.2.1
    # PayPal IPN
    Allow from 216.113.191.33
#    Deny from all

    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /srv/www/htdocs/.htpasswd
    Require valid-user
    Satisfy Any
</Directory>

Теперь я хочу сделать один URL общедоступным, чтобы у всех был к нему доступ. Поскольку это URL-адрес, я выбрал Location директива. Итак, я попробовал следующее:

<Location /url/to/config.xml>
    Order allow,deny
    Allow from all
</Location>

Но независимо от того, какую комбинацию я пытаюсь использовать Order, это просто не сработает, и сервер всегда запрашивает учетные данные. Я что-то упускаю? Насколько я понял из документации на apache.org, директива Location анализируется после Directory и, следовательно, должна иметь возможность отменять ограничения доступа.

Есть идеи / подсказки?

Вы должны иметь возможность сделать это с помощью нескольких блоков <Directory>. Вот ссылка на соответствующую документацию по apache:

http://httpd.apache.org/docs/2.2/sections.html

Я думаю, что ключевые моменты в вашем случае:

Что использовать Когда

Выбор между контейнерами файловой системы и контейнерами веб-пространства на самом деле довольно прост. При применении директив к объектам, находящимся в файловой системе, всегда используйте <Directory> или <Files>. При применении директив к объектам, которые не находятся в файловой системе (например, к веб-странице, созданной из базы данных), используйте <Location>.

Важно никогда не использовать <Location> при попытке ограничить доступ к объектам в файловой системе. Это связано с тем, что множество различных местоположений веб-пространств (URL-адресов) могут отображаться в одном и том же местоположении файловой системы, что позволяет обойти ваши ограничения.

Также http://httpd.apache.org/docs/2.2/sections.html#mergin - в частности:

За исключением <Directory>, каждая группа обрабатывается в том порядке, в котором они указаны в файлах конфигурации. <Directory> (группа 1 выше) обрабатывается в порядке от самого короткого компонента каталога до самого длинного. Так, например, <Directory / var / web / dir> будет обработан до <Directory / var / web / dir / subdir>. Если несколько разделов <Directory> применяются к одному и тому же каталогу, они обрабатываются в порядке файла конфигурации. Конфигурации, включенные с помощью директивы Include, будут обрабатываться так, как если бы они находились во включающем файле в месте расположения директивы Include.

Думаю, это сработает:

<Directory "/srv/www/example.com">
    AllowOverride All
    Options FollowSymlinks -Indexes
    Order deny,allow
    Allow from 127.0.0.0/8 1.2.3.4 5.6.7.8
    # our IP
    Allow from 4.3.2.1
    # PayPal IPN
    Allow from 216.113.191.33
#    Deny from all

    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /srv/www/htdocs/.htpasswd
    Require valid-user
    Satisfy Any
</Directory>
<Directory "/srv/www/example.com/url/to/config.xml">
    Order allow,deny
    Allow from all
</Directory>