Apache - nefunkční konfigurace (mod_access + mod_rewrite)

dr_ak

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:

Kód: [Vybrat]

# 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/*


Kód: [Vybrat]
<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ě:

Kód: [Vybrat]
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:

Kód: [Vybrat]
RewriteRule ^(.*)$ /index.php?request_uri=%{REQUEST_URI}&my_req_uri=%{ENV:my_req_uri} [QSA,L]
Kód: [Vybrat]
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!


Re:Apache - nefunkční konfigurace (mod_access + mod_rewrite)
« Odpověď #1 kdy: 13. 10. 2024, 19:42:51 »
Přepisovací pravidla nastavená na úrovni severu (ne adresáře nebo .htaccess) se provádí před tím, než začne autorizace. Viz https://httpd.apache.org/docs/2.4/rewrite/tech.html.

dr_ak

Re:Apache - nefunkční konfigurace (mod_access + mod_rewrite)
« Odpověď #2 kdy: 14. 10. 2024, 12:38:34 »
Moc děkuji za popostrčení, narychlo jsem vyřešil použitím proměnné, kterou rewrite nepřepisuje a už funguje!

Kód: [Vybrat]
<If "%{THE_REQUEST} =~ m#^(GET|POST) /api/#">