> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# ContentControl- (Weiterleitungskonzept für Inhalte aus Drittsystemen)

> Die Tags, mit denen ein Template seinen eigenen HTTP-Statuscode, seine Location und seinen Inhaltstyp setzt und den Antwortinhalt unterdrückt oder ersetzt.

Werden Inhalte aus einem Drittsystem in den Shop geladen, beispielsweise über ein externes Include oder die JSON-Schnittstelle, und sind diese Inhalte nicht mehr vorhanden, liefert der Shop trotzdem den Statuscode 200 aus. Aus seiner Sicht zu Recht: Das Template, auf dem die fremden Inhalte eingebunden werden, existiert ja.

Für Suchmaschinen ist das ein Problem. Sie bekommen eine funktionierende Seite gemeldet, auf der nichts mehr steht. Mit ContentControl kann ein Template diese Entscheidung nachträglich korrigieren und stattdessen einen 404 oder eine Weiterleitung ausliefern.

Die Tags mit dem Präfix `ContentControl-` greifen dafür in den HTTP-Header ein.

Wegweiser: [SEO-URLs, Abschnitt Weiterleitungskonzept für Inhalte aus Drittsystemen](https://dokumentation.websale.de/v8s/seo/seo-urls-und-link-optimierung.md)

> [!WARNING]
>
> Gemeint ist der HTTP-Header, also das Protokoll zwischen Server und Browser. Das ist nicht der `head`-Bereich des HTML-Dokuments. Wer hier etwas ändert, ändert die Antwort des Servers und nicht den Seiteninhalt.

## Die Voraussetzung

Diese Tags wirken nicht auf beliebigen Templates. Das Template muss in der Shopkonfiguration `shop.config` im Abschnitt `<ContentControlLoadTemplates>` eingetragen und über `WS-LoadTpl()` oder `WS-SSLLoadTpl()` aufgerufen werden.

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ContentControlLoadTemplates>
   +Entry = tpl_cms.htm
</ContentControlLoadTemplates>
```

> [!WARNING]
>
> Für Standard-Templates aus dem Abschnitt `<Templates>` lässt sich die Funktion nicht verwenden. Eine Freischaltung durch die WEBSALE AG braucht es dagegen nicht.

Ob die Funktion an der Stelle, an der Sie gerade stehen, überhaupt greift, prüfen Sie mit `ST-ContentControl`. Klammern Sie den gesamten Block damit ein, dann bleibt er auf einem falschen Template wirkungslos statt fehlerhaft.

## Das vollständige Beispiel

Ein Inhalt aus dem Drittsystem ist verschwunden, und die Seite soll mit einem eigenen 404-Dokument antworten.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ST-ContentControl}
   ~ContentControl-SetHeader_Status(404)~

   <WS-ContentControl-UseAsExclusiveResponseBody>
   <html>
      <head><title>Seite nicht gefunden</title></head>
      <body>
         <h1>Diese Seite gibt es nicht mehr.</h1>
      </body>
   </html>
   </WS-ContentControl-UseAsExclusiveResponseBody>
{/ST-ContentControl}
```

## ContentControl-SetHeader\_Status()

Setzt den HTTP-Statuscode der Antwort.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~ContentControl-SetHeader_Status(404)~
~ContentControl-SetHeader_Status(301)~
```

> [!WARNING]
>
> Der Shop entfernt **alle Leerzeichen** aus dem Parameter. Eine ausgeschriebene Statusmeldung kommt deshalb nicht unverändert an: Aus `404 Not Found` wird `404NotFound`. Geben Sie nur die Zahl an, solange das nicht geklärt ist.

Das Tag ist ein reines Einzel-Tag und unterstützt Tag-in-Tag. Der Statuscode kann also aus einem anderen Tag kommen.

## ContentControl-SetHeader\_Location()

Setzt die Zieladresse der Weiterleitung. Zusammen mit einem Statuscode aus der 300er-Reihe ergibt das eine vollständige Weiterleitung.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~ContentControl-SetHeader_Status(301)~
~ContentControl-SetHeader_Location(https://www.ihr-shop.example/neue-seite)~
~ContentControl-SuppressResponseBody~
```

Eine Weiterleitung braucht keinen Inhalt. Unterdrücken Sie den Antwortinhalt deshalb mit `ContentControl-SuppressResponseBody`, sonst schickt der Shop zusätzlich das geparste Template mit.

### Die Zieladresse aus einem anderen Tag holen

Soll die Zieladresse selbst erst berechnet werden, liefert `DC-WSTagParameter-prepare` das Ergebnis eines Tags als Parameter für ein weiteres Tag.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{DC-WSTagParameter-prepare}
   ~PR-Link(12345)~
{/DC-WSTagParameter-prepare}

~ContentControl-SetHeader_Location($DC-WSTagParameter-use$)~
```

Referenz: [DC-WSTagParameter-prepare](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md#die-tags-im-uberblick)

## ContentControl-SetContentType()

Setzt den Inhaltstyp der Antwort. Ohne dieses Tag sendet der Shop `text/html` mit dem eingestellten Zeichensatz.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~ContentControl-SetContentType(application/json; charset=utf-8)~
```

Es ist nützlich, wenn ein Template kein HTML ausliefern soll, sondern beispielsweise JSON oder XML.

> [!WARNING]
>
> Auch hier entfernt der Shop alle Leerzeichen aus dem Parameter. Ein Inhaltstyp mit Zusatzangabe kommt deshalb ohne Leerzeichen an. Prüfen Sie das Ergebnis, bevor Sie sich darauf verlassen.

## ContentControl-SuppressResponseBody

Unterdrückt den Antwortinhalt. Der Shop liefert dann nur die Kopfzeilen aus.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~ContentControl-SuppressResponseBody~
```

Das Tag lässt sich auch als Bereichs-Tag verwenden und greift dann, wenn ContentControl auf dieser Seite überhaupt aktiv ist. Unterdrückt wird der Inhalt aber nur durch das Einzel-Tag. Die Klammerung allein bewirkt nichts.

> [!WARNING]
>
> Unterdrückung schlägt Ersetzung. Steht `~ContentControl-SuppressResponseBody~` auf der Seite, wird ein mit `WS-ContentControl-UseAsExclusiveResponseBody` gesetzter Inhalt nicht mehr ausgeliefert. Verwenden Sie das eine oder das andere.

## Den Antwortinhalt ersetzen

Soll statt des geparsten Templates ein eigener Inhalt ausgeliefert werden, klammern Sie ihn in ein Markerpaar.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<WS-ContentControl-UseAsExclusiveResponseBody>
   ...
</WS-ContentControl-UseAsExclusiveResponseBody>
```

Das ist kein Tag im gewohnten Sinn und deshalb auch nicht in geschweiften Klammern geschrieben. Der Shop sucht in der fertig geparsten Seite nach diesem Markerpaar und schneidet alles heraus, was dazwischen steht. Genau dieser Ausschnitt wird zur Antwort, alles davor und dahinter entfällt.

> [!WARNING]
>
> Das Markerpaar muss genau so geschrieben werden, öffnend und schließend. Fehlt eines der beiden, findet der Shop den Ausschnitt nicht und liefert die ganze Seite aus.

## Die Reihenfolge in der Antwort

Der Shop setzt die Kopfzeilen in fester Reihenfolge: zuerst den Inhaltstyp, dann die Cookies, dann den Status, dann die Location, dann gegebenenfalls den Dateinamen und zuletzt den Inhalt.

Die Reihenfolge im Template spielt keine Rolle. Sie können den Status vor oder nach der Location setzen, das Ergebnis ist dasselbe. Wichtig ist nur, dass die Tags auf dem Template stehen, bevor es ausgeliefert wird.

## Tags anderer Präfixe

| Tag | Zweck | Präfix |
| - | - | - |
| `ST-ContentControl` | prüft, ob ContentControl an dieser Stelle verfügbar ist | ST- |
| `WS-ContentControl-UseAsExclusiveResponseBody` | Markerpaar für den eigenen Antwortinhalt | WS- |
| `DC-WSTagParameter-prepare` | bereitet ein Tag-Ergebnis als Parameter auf | DC- |

## Die Tags im Überblick

| Tag | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag |
| - | - | - | - | - |
| `ContentControl-SetHeader_Status()` | ja | – | – | – |
| `ContentControl-SetHeader_Location()` | ja | – | – | – |
| `ContentControl-SetContentType()` | ja | – | – | – |
| `ContentControl-SuppressResponseBody` | ja | ja | ja | – |

Zulässig sind alle Tags nur auf Templates, die im Abschnitt `<ContentControlLoadTemplates>` der Shopkonfiguration hinterlegt sind.

## Verwandte Themen

* Wegweiser: [SEO-URLs und Link-Optimierung](https://dokumentation.websale.de/v8s/seo/seo-urls-und-link-optimierung.md)
* Wegweiser: [Externe Inhalte einbinden](https://dokumentation.websale.de/v8s/externe-dienste/externe-inhalte-einbinden.md)
* Wegweiser: [JSON-Schnittstelle](https://dokumentation.websale.de/v8s/externe-dienste/json-schnittstelle.md)
* Referenz: Abschnitt `<[ContentControlLoadTemplates](/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik#contentcontrolloadtemplates)>`


## Related topics

- [DC- (Vergleiche und weitere Tags)](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md)
- [SEO-URLs und Link-Optimierung](https://dokumentation.websale.de/v8s/seo/seo-urls-und-link-optimierung.md)
- [Grundlagen und Technik](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md)
- [Shop, Seite und Technik](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md)
- [Daten-Migration](https://dokumentation.websale.de/migration/daten-migration.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.