ShopConfigHub
Standard-Vorschlag · Beta 0.2.9
Für JTL & Plugin-Hersteller

Wer verwaltet eigentlich die Dateien, die keinem Plugin gehören?

Jeder JTL-Shop hängt an drei serverseitigen Dateien — .htaccess, robots.txt, config.JTL-Shop.ini.php. Updates, Umzüge und vor allem Plugins schreiben dort hinein, meist blind. ShopConfigHub macht daraus eine zentrale, geprüfte, gemeinsam nutzbare Verwaltung — und schlägt sie als Standard fürs JTL-Ökosystem vor.

Das Problem

Schreibt jedes Plugin selbst in die .htaccess, weiß keines, was das andere schon eingetragen hat. Die Folge: kollidierende Rewrites, 404-Ketten, doppelte Regeln — im schlimmsten Fall ein Shop, der nicht mehr startet.

01

Saubere Konfigurationsdateien — zentral verwaltet, auch für andere Plugins

Die eigentliche Grundfunktion: .htaccess, robots.txt und config.JTL-Shop.ini.php nicht mehr als undurchsichtigen Textklumpen behandeln, sondern block-weise — mit sichtbarer Herkunft und einer gemeinsamen Schnittstelle, über die auch fremde Plugins ihre Einträge sicher pflegen.

  • Herkunft jedes Blocks sichtbar

    Automatische Erkennung: JTL-Core, Multidomain, LiteSpeed, LLMS, „App: <Name>“, manuell. Jeder Block einzeln aktivierbar, sortierbar, editierbar — und versioniert mit Grund und Wiederherstellung.

  • Eine Schnittstelle für alle Plugins

    Fremd-Plugins tragen ihre Blöcke nicht mehr selbst in die Datei ein, sondern über eine token-gesicherte API (anlegen, aktualisieren, aktivieren, deaktivieren, löschen). ShopConfigHub schreibt — kontrolliert und konfliktbewusst. Typische Kandidaten sind Plugins, die selbst Rewrites in die .htaccess setzen — etwa das LiteSpeed-Cache-Plugin von ecomData.

  • Kern-Konfiguration geschützt

    In der config werden Defines gezielt je Schlüssel ersetzt statt die Datei neu zu bauen; DB_* und BLOWFISH_KEY sind schreibgeschützt, kritische Defines werden erzwungen.

  • Erst simulieren, dann schreiben

    Ein Betriebsmodus-Schalter (Demo/Scharf) und eine WinMerge-artige Vorschau zeigen den erzeugten Stand neben dem aktuellen — bevor real geschrieben wird.

.htaccess — verwalteter Block
# >>> ShopConfigHub:BEGIN id=42 source="Multidomain" <<<
<IfModule mod_rewrite.c>
  RewriteEngine On
  # deinedomain.de -> deinedomain-de/
  RewriteCond %{HTTP_HOST} ^(www\.)?deinedomain\.de$ [NC]
  RewriteRule ^robots\.txt$ deinedomain-de/robots.txt [L]
</IfModule>
# <<< ShopConfigHub:END id=42 >>>

Marker halten Blöcke identifizierbar — für Menschen, für ShopConfigHub und für andere Plugins.

Jeder Schreibvorgang
1 Backup→ 2 Syntaxprüfung→ 3 Atomarer Write→ 4 Nachkontrolle · Auto-Restore
02

MultiDomain: warum jede Domain eigene Ordner und eigene Dateien braucht

Laufen über admorris MultiDomain (Partner-Plugin) mehrere Domains auf einer Shop-Instanz, teilen sich alle dieselbe physische robots.txt, sitemap und llms.txt im Root. Für Crawler und KI-Bots ist das schlicht falsch.

Der Kern

Unter jeder Domain würden Bots sonst die URLs, Sprachen und Preise der Hauptdomain sehen — nicht die der aufgerufenen Domain. ShopConfigHub legt je Domain ein eigenes Unterverzeichnis an, erzeugt dort domain-spezifische Dateien und routet jede Domain per .htaccess automatisch auf ihre eigenen — nur, wenn die Zieldatei real existiert (keine 404-Fallen).

  • Ein Master-Schalter

    Alle MultiDomain-Funktionen gemeinsam an/aus. Ist kein MultiDomain-Plugin installiert, steht er automatisch auf inaktiv.

  • Redirects je aufgerufener Domain

    Ein eigener, sichtbarer .htaccess-Block pro Domain — korrekt vor dem JTL-Rewrite-Block, wahlweise internes Rewrite oder 301, mit Konfliktprüfung gegen bestehende Regeln.

  • Eigene robots.txt & Sitemap-Kopie

    Je Domain im Backend editierbar; Sitemaps (inkl. referenzierter .gz) werden in den Domain-Ordner kopiert und die Pfade umgeschrieben.

  • llms.txt je Domain — sprach- und preisgenau

    Die llms.txt entsteht z. B. mit dem starken llms.txt-Generator von Webstollen. ShopConfigHub verteilt sie je Domain: Reduktion auf die aktiven Sprachen, alle Shop-URLs auf die Domain-URL umgeschrieben (externe Links bleiben) — und Artikelpreise domainspezifisch neu berechnet.

llms.txt — Preis je Domain korrigiert
# deinedomain.de (Hauptdomain, Bruttopreis Standard-Lieferland)
… ArtNr: ART-100427 | … | Preis: 446,52 EUR | …

# deinedomain.ch (Kundengruppe + CHF + Domain-Steuersatz)
… ArtNr: ART-100427 | … | Preis: 402,15 CHF | …

Aus cArtNr → tpreisdetail.fVKNetto der Domain-Kundengruppe, optional brutto, umgerechnet über twaehrung.fFaktor. Ergebnis: der Preis, den ein Bot auf der Seite tatsächlich sieht. (Werte illustrativ.)

03

Zusatz: eine zentrale URL-Tabelle für Crawls — und für andere Plugins

Aus den je Domain erzeugten Sitemaps liest ShopConfigHub alle URLs (inkl. Sub-Sitemaps, auch .gz) mit lastmod/priority/changefreq aus und schreibt sie domainweise in eine zentrale Tabelle — ressourcenschonend per Cron oder auf Knopfdruck.

xplugin_ShopConfigHub_urls
kDomain  cLoc                               dLastmod    prio
7        https://deinedomain.de/produkt-a   2026-09-28  0.80
7        https://deinedomain.de/produkt-b   2026-09-27  0.64
9        https://deinedomain.ch/produkt-a   2026-09-28  0.80

Domain-genau statt einer einzigen Root-Sitemap, die bei MultiDomain nicht ausreicht.

  • Für Crawler & Cache-Warmer

    Eine saubere, domain-zugeordnete URL-Liste — z. B. als Quelle für den Crawler des LiteSpeed-Cache-Plugins von ecomData statt selbstgebautem Sitemap-Parsing.

  • Für andere Plugins

    Monitoring, Index-Checks, Broken-Link-Prüfer, KI-/GEO-Tools greifen auf eine konsolidierte, aktuelle URL-Basis je Domain zu — statt jede Lösung dasselbe mehrfach zu bauen.

04

Die Token-API im Detail — so binden andere Plugins an

Fremd-Plugins tragen ihre Einträge nicht selbst in die Dateien ein, sondern übergeben sie als Blöcke über einen token-gesicherten HTTP-Endpoint. ShopConfigHub schreibt danach die Zieldatei zentral, konfliktbewusst und mit voller Schutzkette. Dieselbe Referenz steht Entwicklern als aufklappbare Backend-Hilfe direkt im Shop bereit.

  • Endpoint & Methode

    POST https://<shop>/shopconfighub-endpoint.php — Root-Weiche im Shop-Root, weil PHP unter plugins/ gesperrt ist. Body und Antwort sind JSON (UTF-8).

  • Authentifizierung

    Header X-SCH-Token: <token> oder Body-Feld token. Je App im Reiter Plugin Anbindung erzeugt, nur einmal im Klartext gezeigt — gespeichert wird nur der SHA-256-Hash.

  • Scopes & erlaubte Dateien

    Jedes Token trägt Scopes (erlaubte Aktionen) und Targets (erlaubte Dateien). Aktionen außerhalb des Scopes oder auf nicht erlaubte Dateien werden mit 403 abgewiesen.

  • Antwort-Header

    X-Robots-Tag: noindex, nofollow und X-Content-Type-Options: nosniff — der Endpoint ist nicht für Crawler bestimmt.

curl — Block anlegen / aktualisieren
curl -X POST 'https://<shop>/shopconfighub-endpoint.php' \
  -H 'Content-Type: application/json' \
  -H 'X-SCH-Token: <IHR_TOKEN>' \
  -d '{ "action":"push", "target":"htaccess",
        "ref":"litespeed-cache",
        "title":"LiteSpeed Cache Rules",
        "content":"<IfModule LiteSpeed>…</IfModule>",
        "active":true }'

Antwort { "ok": true, "id": 123, "ref": "litespeed-cache", "warnings": [] } — bei Fehler { "ok": false, "error": "…", "errors": [ … ] }.

Aktionen
actionscopePflichtfelderWirkung
pushpushtarget, ref, contentBlock anlegen oder aktualisieren (Upsert je ref).
updateupdatetarget, ref, contentWie push, Block muss existieren (sonst 404).
activateactivaterefBlock aktivieren — wird in die Datei geschrieben.
deactivatedeactivaterefBlock deaktivieren — aus der Datei entfernt, bleibt gespeichert.
deletedeleterefBlock endgültig löschen.
list——Alle eigenen Blöcke des Tokens auflisten.
Felder
FeldTypBeschreibung
targetstringZieldatei: htaccess, robots oder config. Muss in den erlaubten Dateien des Tokens liegen.
refstringStabiler, App-eigener Schlüssel des Blocks (z. B. litespeed-cache). Eindeutig je Token.
contentstringRoh-Inhalt. Wird je Ziel syntaktisch geprüft (.htaccess: Container-Balance; robots: Direktiven; config: token_get_all, verbietet u. a. eval/exec).
titlestring, opt.Anzeigename im Backend (Default „App-Block <ref>“).
infostring, opt.Hinweistext (Default „App: <App-Name>“).
activebool, opt.Beim push initial aktiv? Default true.
HTTP-Status
200 ok 400 Pflichtfeld / unbekannte action 403 Token / Scope / Datei nicht erlaubt 404 Block nicht gefunden 422 Syntaxfehler / Schreiben abgelehnt 500 interner Fehler
Garantie

Jede mutierende Aktion schreibt die Zieldatei neu — mit Backup, Syntaxprüfung, atomarem Write und Auto-Restore. Schlägt das Schreiben fehl, wird die Block-Änderung zurückgerollt, damit Datei und Datenbank konsistent bleiben. App-Blöcke sind mit Quelle App:<Name> gekennzeichnet und bleiben bei einem erneuten Einlesen (Rescan) der Datei erhalten.

05

Was bei einem Update passiert — Plugin und Shop

Zwei Update-Fälle, beide abgesichert: eine neue Plugin-Version und ein Versionssprung des JTL-Shops selbst. Eine getroffene Nutzer-Konfiguration wird in keinem Fall überschrieben.

  • Plugin-Update

    Automatisch beim Update: idempotente Datenbank-Migrationen (per Tracking-Tabelle genau einmal), Sicherstellen des config-Originals, (Neu-)Registrieren des zentralen Crons, (Neu-)Anlegen der Root-Weiche und Setzen des MultiDomain-Master-Defaults (nur falls noch nicht gesetzt). Installiert wird über den JTL-Plugin-Manager.

  • Shop-Versionswechsel

    ShopConfigHub merkt sich, mit welcher Shop-Version das config-Original erfasst wurde. Steigt die Version, wird das Original nur neu erfasst, wenn die Live-config noch keine ShopConfigHub-Region enthält — sonst bleibt das bestehende Original als Restore-Quelle erhalten. Der config-Reiter weist auf den Wechsel hin.

  • Markerbasiert & rescan-fest

    Ändert ein Shop-Update die Kern-Dateien, liest der Admin die betroffene Datei per Rescan neu ein; verwaltete Blöcke werden beim nächsten Schreiben wieder gesetzt, Fremd-/Core-Inhalte bleiben erhalten.

Kompatibilität

Ausgelegt für JTL-Shop 5.6.1 und die gesamte 5.x-Reihe (MaxShopVersion 5.99), abwärtskompatibel innerhalb 5.x.

Sicherheitsnetz — vor jeder Änderung
1 Backup→ 2 Syntaxprüfung→ 3 Atomarer Write→ 4 Auto-Restore

Im Demo-Modus bleiben die Shop-Kern-Dateien ohnehin unangetastet — Änderungen nach einem Update lassen sich erst simulieren, dann real schreiben.

In Vorbereitung für eine spätere Version: automatische Konflikt-Erkennung in der .htaccess nach Shop-Updates inkl. optionaler Benachrichtigung per Shop-Mailfunktion — im aktuellen Beta-Stand noch nicht aktiv.

06

Weitere Funktionen im Überblick

Was sonst noch im Backend steckt — von Betriebsmodus-Details bis zum redigierten Diagnose-Export für die Beta.