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

htaccess по умолчанию запрещает родительский элемент, разрешает виртуальный подпуть с одним регулярным выражением

Я хочу по умолчанию запретить всем анонимным пользователям, но разрешить анонимным пользователям определенный виртуальный путь; виртуальный путь создается wordpress htaccess + php

Текущая настройка

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

Проблема

Приведенный выше код запрещает всем пользователям и запрашивает учетные данные. Однако, если я переключусь на глобальный Allow from All и If к Deny from All тогда это работает, как ожидалось, только отклоняя указанный маршрут

Вопрос

Как я могу разрешить анонимным посетителям мой виртуальный маршрут, сделав все остальное защищенным паролем?

Из-за характера виртуального пути (созданного wordpress) мне пришлось использовать THE_REQUEST вместо:

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

Редирект WordPress использует wordpress/index.php так что используя REQUEST_URI не работал, потому что URI всегда /path/to/wordpress/index.php делает бесполезным оператор my if.

НОТА

Если вам нужно поддерживать PUT или что-то еще, вам нужно будет добавить это. [A-Z]{3} или [A-Z]{3-6} где последний откроется всему.

Судя по всему, вам нужно только запросить аутентификацию, если запрошенный URL-путь не URL-путь, к которому вы хотите разрешить публичный доступ. В противном случае просто разрешите доступ.

Вы также смешиваете директивы аутентификации Apache 2.2 в том, что может показаться системой Apache 2.4.

Вместо этого попробуйте что-нибудь вроде следующего:

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

Вышеупомянутое проверяет, что запрошенный URL не запускается /this/urlpath/is/public/ (вам не хватало привязки начала строки ^ в вашем примере) и запрашивает аутентификацию, только если это не так. Затем действие по умолчанию - разрешить доступ (для любого URL-адреса, начинающегося с этого URL-пути).