--- plan_id: 20260520-1213-admin-too-many-redirects title: Diagnoza i naprawa ERR_TOO_MANY_REDIRECTS na /Admin storage: plan-first legacy_phase: null created: 2026-05-20T12:13:00 status: planned type: execute autonomous: false delegation: auto files_modified: - Admin/index.php - Admin/controller/IndexController.php - Admin/controller/SharedController.php - Admin/controller/LoginController.php - Admin/.htaccess - .htaccess quality_radar: ok --- ## Goal Zlokalizowac i usunac przyczyne bledu ERR_TOO_MANY_REDIRECTS przy wejsciu na https://zurawik.pl/Admin tak, aby niezalogowany uzytkownik dostawal strone logowania (LoginController), a zalogowany - dashboard panelu (StructureController). ## Purpose Panel administracyjny jest obecnie niedostepny - blokuje to wszelkie operacje redakcyjne (Structure, Product, HomeSite, SimpleArticle). Bez dostepu do `/Admin` redaktorzy nie moga zarzadzac trescia ani konfiguracja w `setup`. ## Output - Naprawiony przeplyw routingu/redirectu w `Admin/` (kod lub konfiguracja serwera/htaccess). - Krotki raport w `SUMMARY.md` z opisem przyczyny i sposobu naprawy. - Aktualizacja `.paul/codebase/quality_risks.md` o ewentualne nowe ryzyka ujawnione przy diagnozie. ## Project Docs @.paul/PROJECT.md @.paul/STATE.md @.paul/codebase/architecture.md @.paul/codebase/db_schema.md @.paul/codebase/impact_map.md @.paul/codebase/quality_risks.md ## Source Files @Admin/index.php @Admin/.htaccess @.htaccess @Admin/controller/IndexController.php @Admin/controller/LoginController.php @Admin/controller/SharedController.php @Admin/controller/StructureController.php @Admin/module/AuthDAL.mod.php @core/class/Router.class.php @core/class/FrontController.class.php @core/class/MainController.class.php @core/class/SessionProxy.class.php @core/core.php @core/config/Admin/path.config.php - Wstepna hipoteza: `Admin/controller/IndexController.php:23` zawsze wywoluje `AddRedirect(URL_MAIN.'/Structure/')`, a w `Admin/index.php:43` ustawione jest `Router::$controllerMethodSeek = false`. Bez auto-mapowania URL `/Admin/Structure/` moze nie trafic do `StructureController`, wracac do `IndexController`, ktory ponawia redirect - klasyczna petla. - Drugorzedna hipoteza: niespojnosc protokolu (`https://` w `URL_MAIN` vs. brak `HTTPS=on` za reverse proxy/Cloudflare) prowadzaca do oscylacji HTTP<->HTTPS na poziomie serwera. - Trzecia hipoteza: brak `cookie_secure`/`cookie_domain` powoduje gubienie sesji - kazde zadanie startuje jako niezalogowane, a `SharedController::Auth` w `:172` przekierowuje na `LOGIN`, ktora to trasa nie jest zarejestrowana w `Admin/index.php` i moze generowac URL kierujacy z powrotem do `/Admin/`. - Diagnoza w Tasku 1 ma rozstrzygnac, ktora hipoteza jest prawdziwa, zanim wprowadzimy zmiane w kodzie. ## Quality Radar **Status:** ok (codebase-memory-mcp) **Tools:** codebase-memory-mcp (lekki tryb); jscpd/ast-grep disabled by policy. ## Affected Areas - Bootstrap admina: `Admin/index.php`, `core/core.php`, `core/class/FrontController.class.php`, `core/class/Router.class.php`. - Kontrolery autoryzacji/wejscia: `Admin/controller/IndexController.php`, `Admin/controller/LoginController.php`, `Admin/controller/SharedController.php` (`Auth`), `Admin/controller/StructureController.php`. - Modul autoryzacji: `Admin/module/AuthDAL.mod.php`, `module/AuthDAL.mod.php`. - Konfiguracja URL: `core/config/Admin/path.config.php` (URL_MAIN=https://zurawik.pl/Admin). - Reguly serwera: root `.htaccess` (wyklucza `Admin` z rewrite), `Admin/.htaccess` (rewrite do `index.php`). ## Duplicate / Hardcoded Risks - `Admin/controller/StructureController.php_` i `SimpleArticle_/` to backupy/duplikaty - patrz `quality_risks.md`. Diagnoza musi uwazac, ktory plik jest faktycznie ladowany (autoloader `Core::LoadClass`). - `URL_MAIN` hardkodowany na `https://` w `core/config/Admin/path.config.php:22` - utrudnia debugowanie problemow protokolu. Odlozone (patrz Deferrals). - `Admin/index.php:33-36` zawiera hardkodowane `id` struktur (18/52/30/40) - nie ma zwiazku z biezacym bledem, odlozone. ## Explicit Deferrals - Wyciagniecie tras admina do `Admin/routes.php` - poza zakresem, oddzielny plan. - Rotacja poswiadczen `prodPass` w `core/config/Strona/db.config.php` - krytyczne, ale niezwiazane z petla redirectow; do osobnego planu bezpieczenstwa. - Refaktor `SelfUrl()` (`core/core.php:305`) na detekcje proxy (`HTTP_X_FORWARDED_PROTO`) - rozwazyc w fazie naprawy, ale nie blokuje planu jesli problem lezy w routingu. Brak SPECIAL-FLOWS.md - sekcja pomijana. ## AC-1: Zidentyfikowana przyczyna petli ```gherkin Given panel /Admin zwraca ERR_TOO_MANY_REDIRECTS w przegladarce When wykonamy diagnoze sledzac sekwencje HTTP (curl -I -L --max-redirs 20) oraz logi serwera/PHP Then w SUMMARY.md udokumentowano dokladnie, ktora warstwa (Router / IndexController / SharedController::Auth / .htaccess / proxy HTTPS) wywoluje petle oraz na podstawie ktorego pliku i linii ``` ## AC-2: Wejscie na /Admin konczy sie najwyzej jednym redirectem do zalogowanego dashboardu lub strony logowania ```gherkin Given uzytkownik nie posiada waznej sesji admina When otwiera https://zurawik.pl/Admin Then przegladarka otrzymuje 1-2 przekierowania (max), koncowy status 200, a renderowany szablon to widok logowania (`Admin/template/login.tpl` lub odpowiednik) And `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` zwraca koncowy `HTTP/1.1 200 OK` bez wpadania w limit przekierowan ``` ## AC-3: Zalogowanie skutkuje wejsciem do panelu bez nowej petli ```gherkin Given poprawne dane logowania admina (test na srodowisku stagingowym lub konto testowe) When uzytkownik wykona POST do akcji logowania Then nastepuje pojedyncze przekierowanie do `Structure/Index` i renderuje sie widok panelu, bez kolejnych petli ``` ## AC-4: Brak regresji w innych trasach admina ```gherkin Given naprawa zostala wdrozona When wykonamy smoke test glownych tras: `/Admin/Structure/`, `/Admin/customer/gallery/pl`, `/Admin/Product/`, `/Admin/Login/` Then kazda zwraca 200 (po zalogowaniu) lub redirect do logowania (gdy brak sesji) - nie petle ``` Task 1: Diagnoza - odtworzenie petli i identyfikacja warstwy (brak modyfikacji kodu na tym etapie) 1. Lokalnie/na stagingu (jezeli mozliwe) lub na produkcji w trybie obserwacji: - `curl -I -L --max-redirs 20 https://zurawik.pl/Admin` i zapisac pelny `Location:` chain w `SUMMARY.md`. - Powtorzyc dla `https://zurawik.pl/Admin/` i `https://zurawik.pl/Admin/Structure/`. - Sprawdzic `https://zurawik.pl/Admin/Login/` (czy strona logowania ladowala sie bezposrednio). 2. Tymczasowo wlaczyc szczegolowe logowanie: - w `Admin/index.php` (przed `$front->Dispatch()`) dorzucic `MFLog::Info('REQ ' . $_SERVER['REQUEST_URI'] . ' SCHEME=' . ($_SERVER['HTTPS'] ?? 'off') . ' XFP=' . ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '-'))` (lub uzyc istniejacego loggera log4php). Po diagnozie - usunac. - przejrzec `error_log` w roocie projektu pod katem powtarzajacych sie wpisow w trakcie odtwarzania petli. 3. Rozstrzygnac, ktora hipoteza zachodzi: - (H1) `Router::$controllerMethodSeek = false` + brak trasy `/Structure/` -> `IndexController` ponawia `AddRedirect` (`Admin/controller/IndexController.php:23`). - (H2) Petla na warstwie HTTPS (Cloudflare/proxy) - `SelfUrl()` widzi http, redirect do https, proxy zwraca http. - (H3) Sesja nie persistuje (cookie path/secure) - kazde zadanie zaczyna sie jako niezalogowane, `SharedController::Auth` (`Admin/controller/SharedController.php:172`) wysyla na trase `LOGIN`, ktora nie jest zarejestrowana w `Admin/index.php` -> `Router::GenerateUrl('LOGIN', ...)` zwraca URL prowadzacy z powrotem do `/Admin`. - (H4) Reguly `.htaccess` (root vs `Admin/.htaccess`) - sprawdzic, czy hosting nie ma dodatkowych globalnych regul (force www, force https) w panelu hostingu, ktore tworza petle z PHP. 4. Wynik diagnozy zapisac w sekcji "Diagnoza" pliku `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md` z dokladnymi cytatami z logow/curla. Sekwencja `Location` z curla zapisana; jedna z hipotez H1-H4 potwierdzona z odwolaniem do pliku i linii. AC-1 Checkpoint: zatwierdzenie diagnozy i kierunku naprawy Przedstawic uzytkownikowi wynik Tasku 1 i zaproponowac wariant naprawy (poniewaz kazda hipoteza wymaga innej zmiany): - H1 -> usunac/zmodyfikowac `AddRedirect` w `IndexController::IndexAction` na renderowanie dashboardu albo przelaczyc `Router::$controllerMethodSeek = true`, albo zarejestrowac jawna trase `Structure/Index`. - H2 -> zmodyfikowac `SelfUrl()` i/lub dodac w `Admin/index.php` detekcje `HTTP_X_FORWARDED_PROTO`; ewentualnie wylaczyc force-https na poziomie hostingu. - H3 -> zarejestrowac trase `LOGIN` w `Admin/index.php` (`Router::AddRoute('LOGIN', 'Login/Index', array('controller'=>'LoginController','method'=>'Index'))`) i naprawic konfiguracje sesji (cookie domain/secure) w `core/class/SessionProxy.class.php` lub `Admin/index.php` przed `session_start()`. - H4 -> poprawic `.htaccess` (root lub Admin), wylaczyc reguly hostingu. Uzytkownik wybiera wariant przed przejsciem do Tasku 2. Uzytkownik potwierdzil wybrany wariant. AC-1 (potwierdzenie kierunku) Task 2: Wdrozenie naprawy zgodnie z wybranym wariantem Admin/index.php, Admin/controller/IndexController.php, Admin/controller/SharedController.php, Admin/.htaccess, .htaccess, core/core.php (tylko jezeli wariant H2) Wdrozyc minimalna zmiane wynikajaca z Checkpointu. Zasady: - Modyfikacje musza byc lokalne i odwracalne (jedna konkretna funkcja/trasa/regula). - Nie ruszac kontrolerow innych domen (Product, HomeSite, SimpleArticle) - poza zakresem. - Nie wprowadzac drugiego zrodla prawdy (np. dodatkowych stalych URL). - Usunac tymczasowe logowanie z Tasku 1. - Jezeli wariant wymaga rejestracji trasy `LOGIN`, dodac ja w bloku `Router::AddRoute(...)` w `Admin/index.php` razem z istniejacymi trasami (linie 30-36), z komentarzem WHY (jednolinijkowy). - Jezeli wariant wymaga zmiany `SelfUrl()` lub detekcji `X-Forwarded-Proto`, zmiana ma byc w jednym miejscu (`core/core.php:305`) i nie zmieniac zachowania dla srodowisk bez proxy. `git diff` pokazuje wylacznie pliki z `files_modified`; lokalny test `curl -I -L https://zurawik.pl/Admin` konczy sie kodem 200. AC-2 Task 3: Smoke test panelu po naprawie (brak modyfikacji kodu) 1. Bez sesji: `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` -> oczekiwane 200 (strona logowania) lub redirect do `/Admin/Login/`. 2. Z waznym ciasteczkiem sesji (po zalogowaniu w przegladarce): odwiedzic `/Admin`, `/Admin/Structure/`, `/Admin/customer/gallery/pl`, `/Admin/Product/`. Oczekiwany kod 200 i renderowanie szablonu. 3. Sprawdzic `error_log` w roocie - brak nowych powtarzajacych sie bledow. 4. Wyniki dopisac do `SUMMARY.md` (sekcja "Smoke test po naprawie"). Wszystkie testy z punktu 1-2 zwracaja 200 bez petli przekierowan. AC-3, AC-4 ## Do Not Change - `core/class/Router.class.php`, `core/class/FrontController.class.php` i inne klasy `core/class/*` - poza zakresem chyba ze diagnoza wskaze konkretny blad w `core/class/*`; wtedy zmiana wymaga osobnego ustalenia z uzytkownikiem. - Logika autoryzacji w `Admin/module/AuthDAL.mod.php` - nie zmieniamy hashowania ani struktury sesji. - Plikow z prefiksem `*_`, `*.bak`, `*.php_` (`StructureController.php_`, `SimpleArticle_/`, `MainController.class.php.bak`, `Router.class.php.bak`) - to legacy duplikaty, nie ruszamy w tym planie. - Konfiguracji bazy (`core/config/*/db.config.php`). - `index.php` (publiczny) i kontrolerow w `controller/` - poza zakresem. ## Scope Limits - Plan dotyczy wylacznie petli przekierowan na `/Admin`. Nie obejmuje rotacji hasel, refaktoru routes admina do osobnego pliku, ani modernizacji Smarty/CKEditor. - Nie wdrazamy mechanizmu "remember me", nie zmieniamy logiki `AuthDAL::Login`. - Nie wdrazamy nowych testow automatycznych (projekt nie ma frameworka testowego - patrz `.paul/codebase/testing.md`). - [ ] `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` zwraca koncowy `200 OK`. - [ ] `curl -I -L --max-redirs 5 https://zurawik.pl/Admin/Structure/` (z sesja) zwraca `200 OK`. - [ ] `git diff` ograniczony do plikow z `files_modified`. - [ ] `error_log` w roocie nie zawiera powtarzajacych sie wpisow po naprawie. - [ ] Brak tymczasowych logow diagnostycznych w kodzie po Task 2. - [ ] Quality Radar - ryzyka z `impact_scan` zaadresowane lub jawnie odlozone. - [ ] AC-1, AC-2, AC-3, AC-4 spelnione. - [ ] `SUMMARY.md` zawiera diagnoze, opis naprawy, smoke test i ewentualne nowe ryzyka. - [ ] `.paul/codebase/quality_risks.md` zaktualizowane, jezeli diagnoza ujawnila nowe ryzyka (np. brak rejestracji trasy `LOGIN`, `SelfUrl()` niewspoldzialajacy z proxy). SUMMARY.md path: `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md`