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

местоположение apache соответствует отрицательному регулярному выражению

Я пытаюсь открыть локацию через 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.

  • Два пути запрещены, а другие пути да
  • Я добавил перезапись из / в / ui, чтобы было возможно

Вот использование директивы 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>