Htaccess Requerer o expr Apache 2.4 funciona no osx-sierra não no debian-jessie

1

Na minha máquina de desenvolvimento osx-sierra / apache 2.4.10 (do brew) Eu tenho uma restrição em um VirtualHost que permite acesso a / api / sem senha, e todas as outras páginas precisam da senha com este código:

<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /Users/xxxxxx/www/public/.htpasswd
    Require expr %{REQUEST_URI} =~ m#^/api/*#
    Require valid-user
</Location>

Quando eu tento fazer isso no meu servidor de produção com as mesmas diretivas, Debian-jessie / apache 2.4.29 (do apt), ele não funciona, a senha é sempre perguntar (chrome / safari / wget), eu tentei teses soluções:

1 /

<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /home/xxxxxx/www/public/.htpasswd
    Require expr %{REQUEST_URI} =~ m#^/api/*#
    Require valid-user
</Location>

2 /

<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /home/xxxxxx/www/public/.htpasswd
    Require expr %{REQUEST_URI} =~ m#^/api/.*#
    Require valid-user
</Location>

Alguma idéia de por que essas diferenças?

Obrigado

    
por Nicolo 30.01.2018 / 15:22

3 respostas

0

Não sei por que isso funcionaria no osx-sierra / Apache 2.4.10, mas aparentemente não no Debian-jessie / Apache 2.4.29. No entanto, como uma solução alternativa, você poderia fazer isso de uma maneira diferente usando uma lookahead negativa em um contêiner <LocationMatch> em vez de usar expressões do Apache 2.4. Por exemplo:

<LocationMatch "^(?!/api/.*$).*$">
    AuthType Basic
    AuthName "Access"
    AuthUserFile /Users/xxxxxx/www/public/.htpasswd
    Require valid-user
</LocationMatch>

Agora, as diretivas dentro do contêiner <LocationMatch> só são processadas quando o URL não inicia /api/ . (Isso também funciona no Apache 2.2)

    
por 30.01.2018 / 18:37
0

Este é o virtualhost completo onde as diretivas não funcionam:

<VirtualHost *:80>
DocumentRoot /home/xxxxxx/www/public
ServerName xxxxxx.com

Header set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, PUT, GET, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "x-so-resource, x-so-apikey, x-so-apisecret, x-token, Authorization, Content-Type"

<Directory /home/xxxxxx/www/public>
    php_value include_path "/home/xxxxxx/libs/ZendFramework-1.11.11/library"
    Options +FollowSymLinks 
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

ServerSignature Off

AddDefaultCharset UTF-8

php_value short_open_tag 0

SetEnv APPLICATION_ENV development


<Location />
    RewriteEngine On     
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
</Location>


<LocationMatch "^(?!/api/.*$).*$">
    AuthType Basic
    AuthName "Access"
    AuthUserFile /home/xxxxxx/www/public/.htpasswd
    Require valid-user
</LocationMatch>

ErrorLog /var/log/apache2/xxxxxxxx-error.log
CustomLog /var/log/apache2/xxxxxxxx-access.log combined

    
por 31.01.2018 / 10:05
0
Por que complicar tanto em vez de fazê-lo simples?
<Location />
    AuthType Basic
    AuthName "Access"
    AuthUserFile /home/xxxxxx/www/public/.htpasswd
    Require valid-user
</Location>

<Location /api>
        Require all granted
</Location>

Observe também que sua diretiva anterior, Directory (o diretório do documentroot), que mistura as diretivas 2.2.xe 2.4.x, pode estar estragando tudo.

Uma bagunça:

Order allow,deny
Allow from all
Require all granted

A coisa certa a fazer:

Require all granted
  • Certifique-se de remover o 2.2. diretivas e descarregar mod_access_compat para ter certeza, o que você faz é uma receita para obter resultados inesperados. Considere também que arquivos .htaccess podem estar afetando o resultado devido a configuração de AllowOverride all, o que idealmente você não deve usar se você for o administrador do site.
por 31.01.2018 / 13:14