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

Jul 19 2019

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 pede credenciais. No entanto, se eu alternar global para Allow from Alle Ifpara Deny from All, isso funcionará como esperado, apenas negando a rota especificada

Questão

Como posso permitir que visitantes anônimos acessem minha rota virtual enquanto faço tudo o mais protegido por senha?

Respostas

MrWhite Jul 19 2019 at 19:20

Pelo que parece, você só precisa pedir autenticação se o caminho de URL solicitado não for o caminho de 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.

Em vez disso, 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 a URL solicitada não inicia /this/urlpath/is/public/(faltou uma âncora de início de string ^em seu exemplo) e somente solicita autenticação se não iniciar . A ação padrão é então permitir o acesso (para qualquer URL que comece com aquele caminho de URL).

Jacksonkr Jul 20 2019 at 02:54

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

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

O redirecionamento do wordpress usa, wordpress/index.phpportanto, 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.

NOTA

Se precisar de suporte para PUTs ou outro, você terá que adicioná-lo. [A-Z]{3}Ou [A-Z]{3-6}onde o último abrirá para tudo.