
Я хочу запретить всем анонимным пользователям доступ по умолчанию, но разрешить анонимным пользователям доступ по определенному виртуальному пути; виртуальный путь создается с помощью 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}
где последнее будет открыто для всего.