Die Verwaltung kann umziehen: /admin ist frei waehlbar

php bin/console cms:admin:path <neu> legt die Verwaltung auf eine
andere Adresse. Geprueft wird, dass der Name frei ist und keine Seite
verdeckt; der Wert steht in .env.local und fuellt einen Parameter, der
als Praefix in jeder Verwaltungsroute steht, in der Firewall, in den
Schutzkopfzeilen und in der Statistik.

Die robots.txt nennt einen geaenderten Namen nicht - sie ist oeffentlich
und waere sonst ein Wegweiser. Beim Standardnamen bleibt die Zeile,
weil diese Adresse ohnehin jeder kennt.

Die Auffangroute fuer Seiten steht jetzt zuletzt: sie kann einen frei
gewaehlten Namen nicht per Regex ausschliessen, und die Reihenfolge ist
ohnehin die richtige. Der Befehl raeumt den Zwischenspeicher auf, aber
nicht den, in dem er selbst laeuft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kantarciandClaude Opus 5 committed 2026-09-13 20:51:55 +02:00
1 parent 9f1ac39251
commit aaea385422
26 files changed
+293 -45

No files matched your search

+4 -2
View File
@@ -22,7 +22,7 @@ use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
final class Statistics
{
/** Everything that is not a page of this site, or not a visit at all. */
private const IGNORED = '#^/(admin|media/|assets/|einwilligung$|feed\.xml$|sitemap\.xml$|robots\.txt$|llms\.txt$|favicon)#';
private const IGNORED = '#^/(media/|assets/|einwilligung$|feed\.xml$|sitemap\.xml$|robots\.txt$|llms\.txt$|favicon)#';
/**
* A heuristic, and nothing more: user agents lie. It keeps the obvious crawlers and monitors
@@ -40,7 +40,7 @@ final class Statistics
/** After two months the hours of a day are merged into one row. */
public const COMPACT_AFTER_DAYS = 60;
public function __construct(private Connection $db)
public function __construct(private Connection $db, private string $adminPath = 'admin')
{
}
@@ -51,6 +51,8 @@ final class Statistics
&& in_array($status, [200, 404], true)
&& str_contains($contentType, 'text/html')
&& 1 !== preg_match(self::IGNORED, $path)
// Die Verwaltung ist kein Besuch - unabhaengig davon, wie sie heisst.
&& !str_starts_with($path, '/'.$this->adminPath)
&& 1 !== preg_match(self::MACHINES, $userAgent);
}