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