Я пытаюсь открыть локацию через Apache. Обычно у меня есть этот блок в моем vhost, который говорит
<Location />
AuthType Basic
AuthUserFile /web/.htpasswd
AuthName "Test Site"
Require valid-user
</Location>
Это прекрасно работает - все обслуживаемое требует действующего пользователя. Теперь я хочу предоставить службу, которая не требует аутентификации, поэтому я ищу способ, чтобы все местоположения, кроме / services, требовали аутентификации. Я играл с LocationMatch, но не совсем понимаю, что он делает.
<LocationMatch ^/(?!services)[^.]*$>
AuthType Basic
...
</LocationMatch>
Позволяет / services и всем, что находится под ним, пропускать LocationMatch, но имеет побочный эффект, позволяющий example.com/.somefile обходить блок LocationMatch.
Кроме того, когда я попробовал
<LocationMatch ^/(?!services)>
AuthType Basic
...
</LocationMatch>
все (включая / services) соответствует LocationMatch.
Я был бы признателен, если бы кто-нибудь мог сказать мне, что делает класс [^.] *, Чего не делает второй тест, и как предоставлять только / services, сохраняя все остальные пути под аутентификацией.
Эта страница Антонио Лоруссо предлагает следующее, чтобы исключить папки из аутентификации apache:
<Location "/">
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/www/clients/client12/web17/passwd
AuthGroupFile /dev/null
Require valid-user
SetEnvIf Request_URI "^/(admin|skin|js|index)(.*)$" allow
SetEnvIf Request_URI "^/favicon.ico$" allow
Order allow,deny
Allow from env=allow
Satisfy Any
</Location>
В этом случае URL-адреса, начинающиеся с / admin, / skin, / js или / index, будут игнорироваться auth.
Ключевая часть этого раздела для вас:
SetEnvIf Request_URI "^/(admin|skin|js|index)(.*)$" allow
В вашем случае соответствующий код будет:
SetEnvIf Request_URI "^/services(.*)$" allow
_
Хорошо, [^.]
означает "не .
", поэтому /.somefile
не совпадает. Возможная причина, по которой ваш последний пример не работает, заключается в том, что регулярные выражения, совместимые с Perl, поддерживаются только начиная с Apache 2.0, поэтому, если вы используете Apache 1.3 (вы действительно должны указать версию Apache в своем вопросе), это будет будь то.
Поддерживать
<Location />
AuthType Basic
AuthUserFile /web/.htpasswd
AuthName "Test Site"
Require valid-user
</Location>
и добавьте это новое местоположение
<Location /services>
Satisfy any
Order deny,allow
</Location>
С apache 2.4 вы можете сделать что-то вроде этого:
<Location />
<If "%{REQUEST_URI} =~ m#^/services/#">
Satisfy any
Order deny,allow
</If>
<Else>
AuthType Basic
AuthUserFile /web/.htpasswd
AuthName "Test Site"
Require valid-user
</Else>
</Location>
Пробовал много способов безуспешно.
И, наконец, это работает на apache 2.2.
Вот использование директивы LocationMatch
<LocationMatch /(firstpath|secondpath).*>
AuthType Basic
AuthName "Restricted AREA "
AuthUserFile /etc/apache2/security/password
AuthGroupFile /etc/apache2/security/group
Require group admin
Order allow,deny
Allow from 127.0.0.1
Allow from 10.0.0.0/24
Allow from env=allowclient
Satisfy any
</LocationMatch>