Zasekl jsem se v konfiguraci Apache, předem děkuji za Váš čas a nezávislý pohled, nápady, rady...
Máme PHP aplikaci, která má celkem běžné nastavení - vše co není soubor nebo adresář se pomocí rewrite přesměruje na index.php.
Dále tam je omezení přístupu buď z vyjmenovaných IP adres, nebo se zadáním jména a hesla pomocí basic auth pro ostatní IP. Relevantní fragment konfigurace vypadá takto:
# Povolení přístupu z IP:
Require ip 1.1.1.1
Require ip 2.2.2.2
Require ip 3.3.3.3
........
# Povolení přístupu jménem a heslem:
AuthType Basic
AuthUserFile /var/www/.htpasswd
Require valid-user
# Přesměrování na index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?_url=/$1 [QSA,L]
Takto vše bez problémů funguje.
Nově je požadavek mít cestu začínající "/public/" volně přístupnou odkudkoliv bez nutnosti zadat heslo.
Přidal jsem podmínku, která povoluje přístup pro /public/*
<If "%{REQUEST_URI} =~ m#^/public/#">
Require all granted
</If>
Tohle funguje krásně pro všechny soubory a adresáře, které jsou přímo přístupné i z neregistrovaných IP.
Ale u adres, které finální RewriteRule mapuje na index.php to nefunguje - server vrátí 401 Unauthorized jako vracel dříve a podmínka se, zdá se, nevyhodnotí.
Měl jsem podezření, že RewriteRule nějak manipuluje s proměnnými, tedy jsem zkusil proměnnou REQUEST_URI vložit do své proměnné a v If testovat tu, kterou není určitě manipulováno, ale chovalo se to stejně:
SetEnvIf REQUEST_URI "^(.*)$" my_req_uri=$1
<If "%{ENV:my_req_uri} =~ m#^/public/#">
Require all granted
</If>
Také jsem proměnnou REQUEST_URI i svou pomocnou proměnnou my_req_uri předal jako parametr do index.php, kde jsem je vypisoval, abych otestoval jejich obsah:
RewriteRule ^(.*)$ /index.php?request_uri=%{REQUEST_URI}&my_req_uri=%{ENV:my_req_uri} [QSA,L]
echo "request_uri=".$_GET['request_uri']."\n";
echo "my_req_uri=".$_GET['my_req_uri']."\n";
ale vše se tvářilo v pořádku, obě proměnné obsahovaly testovací URL /public/12321
Zkoušeli jsme toho ještě více, ale tohle byla nejnadějnější cesta, která nás přivedla k paradoxu - konfigurace funguje, pokud se neprovádí finální RewriteRule. Když se RewriteRule provede, tak patrně nefunguje podmínka, jakoby Rewrite manipuloval s proměnnými, ale proměnné se asi nemění, alespoň ten samý RewriteRule je předává v pořádku.
Za každou radu či nakopnutí děkuji!