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

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то это работает как и ожидалось, отклоняя только указанный маршрут

Вопрос

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

решение1

Судя по всему, вам нужно запрашивать аутентификацию только в том случае, если запрашиваемый 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-пути).

решение2

Из-за особенностей виртуального пути (созданного 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}где последнее будет открыто для всего.

Связанный контент