htaccess verweigert übergeordnetes Element standardmäßig, erlaubt einzelnen virtuellen Regex-Unterpfad

htaccess verweigert übergeordnetes Element standardmäßig, erlaubt einzelnen virtuellen Regex-Unterpfad

Ich möchte standardmäßig alle anonymen Benutzer ablehnen, aber anonyme Benutzer für einen bestimmten virtuellen Pfad zulassen. Der virtuelle Pfad wird durch ein WordPress-HTAccess + PHP erstellt.

Aktuelles Setup

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

Problem

Der obige Code lehnt alle Benutzer ab und verlangt Anmeldeinformationen. Wenn ich jedoch global auf Allow from Allund Ifdann auf umschalte Deny from All, funktioniert dies wie erwartet und verweigert nur die angegebene Route.

Frage

Wie kann ich anonymen Besuchern den Zugriff auf meine virtuelle Route gestatten und gleichzeitig alles andere durch ein Passwort schützen?

Antwort1

So wie es klingt, müssen Sie nur dann eine Authentifizierung anfordern, wenn der angeforderte URL-Pfadnichtder URL-Pfad, für den Sie den öffentlichen Zugriff zulassen möchten. Und erlauben Sie andernfalls einfach den Zugriff.

Sie mischen außerdem Apache 2.2-Authentifizierungsdirektiven in ein System ein, das wie ein Apache 2.4-System aussieht.

Versuchen Sie stattdessen etwas wie das Folgende:

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

Oben wird überprüft, ob die angeforderte URL nicht beginnt /this/urlpath/is/public/(in Ihrem Beispiel fehlte ein Start-of-String-Anker ^) und nur dann wird zur Authentifizierung aufgefordert, wenn dies nicht der Fall ist. Die Standardaktion besteht dann darin, den Zugriff zuzulassen (für jede URL, die mit diesem URL-Pfad beginnt).

Antwort2

Aufgrund der Art des virtuellen Pfads (erstellt von WordPress) musste ich THE_REQUESTstattdessen Folgendes verwenden:

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

Die WordPress-Umleitung funktionierte wordpress/index.phpalso REQUEST_URInicht, da die URI /path/to/wordpress/index.phpmeine if-Anweisung immer unbrauchbar machte.

NOTIZ

Wenn Sie PUTs oder anderes unterstützen müssen, müssen Sie das hinzufügen. [A-Z]{3}Oder [A-Z]{3-6}wo Letzteres für alles geöffnet wird.

verwandte Informationen