fix: /api/exists gab ohne Token Auskunft -- der Proxy hatte sie zwischengespeichert

GEMESSEN, nicht vermutet: ein GET auf

    https://fivemanage.d4rkst3r.de/api/exists/vehicles/adder.webp

antwortet OHNE Authorization-Kopf mit 200 und voller Auskunft -- Pfad, Groesse,
SHA-256, Zeitpunkt. Nicht weil die Pruefung fehlt, sondern weil Nginx Proxy
Manager die berechtigte Antwort weggelegt hat und sie danach an jeden ausliefert.

Der Grund steht in dessen assets.conf und greift auf JEDE URL mit Bildendung:

    location ~* ^.*\.(css|js|jpe?g|gif|png|webp|...)$ {
        proxy_cache public-cache;
        proxy_cache_key $host$request_uri;          <- ohne Authorization
        proxy_ignore_headers Set-Cookie Cache-Control Expires ...;
        proxy_cache_valid any 30m;
    }

Unser eigenes Cache-Control hilft nicht, proxy_ignore_headers wirft es weg. Und
es geht auch andersherum: landet zuerst ein 401 im Zwischenspeicher, bekommen
ihn 30 Minuten lang alle -- auch die mit gueltigem Token.

Der Block "location ^~ /api/ { proxy_cache off; }" schliesst das. Aber eine
ZUGANGSPRUEFUNG, DIE AN EINER ZEILE IN EINER FREMDEN OBERFLAECHE HAENGT, IST
KEINE: sie ueberlebt kein Neuanlegen des Proxy-Hosts und keinen Umzug.

Deshalb eine zweite Form, die von sich aus dicht ist:

    GET /api/exists?pfad=vehicles/adder.webp

Die Abfrage zaehlt fuer die location-Regel nicht mit, die URL endet also nie auf
eine Bildendung. Gemessen: mit Token 200, ohne Token 401, und KEINE
Cache-Control-Kopfzeile vom Proxy -- die Regel greift nicht.

Die alte Form bleibt, weil das Fotostudio sie benutzt (server/upload.lua:185).
Dokumentation und die API-Seite im Dashboard nennen ab jetzt nur noch die neue.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 23:00:27 +02:00
co-authored by Claude Opus 5
parent 44ad7dc6b3
commit 92b49a59a5
3 changed files with 69 additions and 5 deletions
+23 -1
View File
@@ -235,11 +235,33 @@ heraus wäre entweder Mixed Content oder ginge ins Leere.
---
## GET /api/exists/&lt;pfad&gt;
## GET /api/exists?pfad=&lt;pfad&gt;
Für „nur fehlende" in einem Serienlauf: eine winzige Antwort gegen 130 KB
Upload.
> **Diese Form und nicht mehr `/api/exists/<pfad>`** — der Grund ist
> nachgemessen und unangenehm. Die alte Form endet auf `.webp`, und Nginx
> Proxy Managers `assets.conf` greift auf **jede** URL mit Bildendung:
>
> ```nginx
> location ~* ^.*\.(css|js|jpe?g|gif|png|webp|...)$ {
> proxy_cache public-cache;
> proxy_ignore_headers Set-Cookie Cache-Control Expires ...;
> proxy_cache_valid any 30m;
> }
> ```
>
> Der Proxy legt die berechtigte Antwort weg und liefert sie danach **an jeden
> aus, auch ohne Token** — gemessen: 200 mit voller Auskunft, `Authorization`
> gar nicht gesetzt. Unser eigenes `Cache-Control` hilft nicht,
> `proxy_ignore_headers` wirft es weg. Und es geht auch andersherum: landet
> zuerst ein `401` im Zwischenspeicher, bekommen ihn 30 Minuten lang alle.
>
> Die Abfrageform endet nie auf eine Bildendung und ist deshalb **von sich aus**
> dicht — ohne von einer Zeile in einer fremden Oberfläche abzuhängen. Die alte
> Form bleibt, weil Skripte sie benutzen; neu gebaut wird mit dieser.
```json
{ "exists": true, "path": "vehicles/adder.webp",
"url": "…", "size": 132760, "sha256": "…", "updated_at": 1786466462488 }