htaccess nega pai por padrão, permite subcaminho virtual de regex único

htaccess nega pai por padrão, permite subcaminho virtual de regex único

Quero negar todos os usuários anônimos por padrão, mas permitir usuários anônimos para um caminho virtual específico; o caminho virtual é criado por um wordpress htaccess + php

Configuração atual

AuthUserFile /var/www/domains/dev/.htpasswd
AuthType Basic
AuthName "Password Required"
Require user jackson dawna
Order Deny,Allow
Deny from All

<If "%{REQUEST_URI} =~ m#/sites/dawna/wordpress/wp-json/wp/v2/.*#">
        Order Allow,Deny
        Allow from All
        Satisfy Any
</If>

Satisfy Any

Problema

O código acima nega todos os usuários e solicita credenciais. No entanto, se eu mudar global para Allow from Alle Ifpara Deny from All, isso funcionará conforme o esperado, negando apenas a rota especificada

Pergunta

Como posso permitir visitantes anônimos em minha rota virtual e, ao mesmo tempo, proteger todo o resto com senha?

Responder1

Pelo que parece, você só precisa solicitar autenticação se o caminho da URL solicitada fornãoo caminho da URL que você deseja permitir acesso público. E simplesmente permita o acesso de outra forma.

Você também está misturando as diretivas de autenticação do Apache 2.2 no que parece ser um sistema Apache 2.4.

Tente algo como o seguinte:

<If "%{REQUEST_URI} !~ m#^/this/urlpath/is/public/#">
    AuthUserFile /var/www/domains/dev/.htpasswd
    AuthType Basic
    AuthName "Password Required"
    Require user jackson dawna
</If>

O procedimento acima verifica se o URL solicitado não inicia /this/urlpath/is/public/(faltava uma âncora de início de string ^no seu exemplo) e apenas solicita autenticação se isso não acontecer. A ação padrão é permitir o acesso (para qualquer URL que comece com esse caminho de URL).

Responder2

Devido à natureza do caminho virtual (criado pelo wordpress), tive que usar THE_REQUEST:

<If "%{THE_REQUEST} =~ m#^GET /sites/dawna/wordpress/wp-json/#">
        Allow from All
        Satisfy Any
</If>

O redirecionamento do wordpress usa wordpress/index.phpentão o uso do REQUEST_URInão estava funcionando porque o uri está sempre /path/to/wordpress/index.phptornando a instrução my if inútil.

OBSERVAÇÃO

Se você precisar oferecer suporte a PUTs ou outros, terá que adicioná-los. [A-Z]{3}Ou [A-Z]{3-6}onde o último se abrirá para tudo.

informação relacionada