Environment
- SILO Console v2.0.0 at
b952a1202869b89e5cc7b821a0b5651f74e09d08
- SILO server
RELEASE.2026-08-04T00-00-00Z
- Chrome, tested against
m.pigsty on 2026-08-05
- Both HTTP and HTTPS currently serve the SPA fallback with
200 OK; an unauthenticated GET /api/v1/session returns 403
Reproduction
- Use an origin without a Console session. Opening the plain-HTTP origin is a reliable way to reproduce because the HTTPS session is not available there.
- Open
http://m.pigsty/browser (or another protected deep route).
- Watch the address bar.
Actual result
The relative login path is appended repeatedly:
/browser/login
/browser/login/login
/browser/login/login/login
...
Starting at the root produces /login/login/.... In the live test the path gained hundreds of segments in about two seconds. Access logs have shown roughly 1,300 login segments / 7.8 KiB request targets before nginx eventually returns 414 Request-URI Too Large.
Expected result
An unauthenticated protected route should navigate once to the absolute, base-path-aware login URL. The original protected path should be saved once for the post-login return.
Root cause and regression window
ProtectedRoutes.tsx currently redirects to the relative pathname login. The wildcard protected route then catches the newly nested path again in MainRouter.tsx.
The relative redirect was introduced upstream on 2022-07-20 by cdb1659. It became an active SILO regression on 2026-08-04 in 23ae6e8, which upgraded react-router-dom from 6.30.3 to 7.18.2. In other words: the unsafe relative redirect is old, but the v2.0.0 behavior was introduced on 2026-08-04.
The existing nginx subpath test covers only the exact root URL, not a protected deep link: test-unauthenticated-user.ts.
Acceptance criteria
- Use a single absolute/base-path-aware login destination.
/, /browser, /tools/metrics, and a nested protected URL do not gain repeated login segments.
- Add unauthenticated deep-link coverage, including the subpath deployment case.
- The saved return path is not overwritten by each login navigation.
- Preferably redirect HTTP to HTTPS at the edge as defense in depth; the client-side redirect must still be correct when an HTTPS session is absent.
Environment
b952a1202869b89e5cc7b821a0b5651f74e09d08RELEASE.2026-08-04T00-00-00Zm.pigstyon 2026-08-05200 OK; an unauthenticatedGET /api/v1/sessionreturns403Reproduction
http://m.pigsty/browser(or another protected deep route).Actual result
The relative login path is appended repeatedly:
Starting at the root produces
/login/login/.... In the live test the path gained hundreds of segments in about two seconds. Access logs have shown roughly 1,300loginsegments / 7.8 KiB request targets before nginx eventually returns414 Request-URI Too Large.Expected result
An unauthenticated protected route should navigate once to the absolute, base-path-aware login URL. The original protected path should be saved once for the post-login return.
Root cause and regression window
ProtectedRoutes.tsx currently redirects to the relative pathname
login. The wildcard protected route then catches the newly nested path again in MainRouter.tsx.The relative redirect was introduced upstream on 2022-07-20 by cdb1659. It became an active SILO regression on 2026-08-04 in 23ae6e8, which upgraded
react-router-domfrom6.30.3to7.18.2. In other words: the unsafe relative redirect is old, but the v2.0.0 behavior was introduced on 2026-08-04.The existing nginx subpath test covers only the exact root URL, not a protected deep link: test-unauthenticated-user.ts.
Acceptance criteria
/,/browser,/tools/metrics, and a nested protected URL do not gain repeatedloginsegments.