---
title: "config: TypoScript configuration"
manual: "TypoScript Explained"
version: "main"
permalink: "https://docs.typo3.org/permalink/t3tsref:top-level-objects-config@main"
source: "TopLevelObjects/Config.rst"
modified: "2026-09-15T19:22:01+00:00"
---

# `config`: TypoScript configuration

The `config` top-level object does not have to be initialized. Configuration
can be set like this:

**config/sites/my_site/setup.typoscript**

```
# TypoScript
config {
    headerComment = Made with ❤ by your TYPO3 Documentation Team
}
```

**Table of content**

-   [Properties of 'config'](https://docs.typo3.org/permalink/t3tsref:properties-of-config@main)
-   [Examples of configuration in TypoScript using config.](https://docs.typo3.org/permalink/t3tsref:examples-of-configuration-in-typoscript-using-config@main)
-   [Frontend asset concatenation and compression not supported](https://docs.typo3.org/permalink/t3tsref:frontend-asset-concatenation-and-compression-not-supported@main)

## Properties of 'config'

> [!NOTE]
> **Changed in version 14.0**
>
> `config.absRefPrefix` was removed. See
> [Breaking: #108114 - Global frontend content link prefixing removed](https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/14.0/Breaking-108114-GlobalFrontendContentLinkPrefixingRemoved.html#breaking-108114-1763085569)

**Properties of the CONFIG object**

**additionalHeaders**

-   **additionalHeaders**

    -   *Type:* numerically indexed array of "HTTP header entries".
    -   *Example:* [config.absRefPrefix removed from frontend TypoScript](https://docs.typo3.org/permalink/t3tsref:setup-config-additionalheaders@main)

    `config.additionalHeaders` allows additional HTTP headers
    to be configured. An entry has the following structure:

    -   **`10.header = the header string`**

        This value is required.

    -   **`10.replace = 0 | 1`**

        Optional, boolean. Default value is `1`.
        If `1` the header will replace an existing header with the same name.

    -   **`10.httpResponseCode = 201`**

        Optional, integer. The http status code that the page should return.

    By default, TYPO3 sends a "Content-Type" header with the defined
    encoding. It then sends cache headers if configured via
    [Properties of 'config'](https://docs.typo3.org/permalink/t3tsref:setup-config-sendcacheheaders@main) and then any additional headers.
    Finally, a "Content-Length" header is sent, if enabled via
    [Properties of 'config'](https://docs.typo3.org/permalink/t3tsref:setup-config-enablecontentlengthheader@main).

**admPanel**

-   **admPanel**

    -   *Type:* boolean

    `config.admPanel = 1` enables the admin panel. See
    [Configuration in the Admin Panel manual](https://docs.typo3.org/c/typo3/cms-adminpanel/main/en-us/Configuration/Index.html#typoscript-config-admpanel).

**ATagParams**

-   **ATagParams**

    -   *Type:* *\<A>-params*

    Additional parameters for all links in TYPO3 (excluding menu-links).

**cache**

-   **cache**

    -   *Type:* array
    -   *Example:* [config cache examples](https://docs.typo3.org/permalink/t3tsref:setup-config-cache@main)

    Determine the maximum cache lifetime of a page.

    The maximum cache lifetime of a page can be determined by
    start and stop times of content elements on that page, as well as
    arbitrary records on any other page. The page needs to be
    configured so that TYPO3 knows which records' start and stop times to
    take into account. Otherwise, the cache entry might be used although a
    start/stop date has already passed by.

    To include records of type \<table name> on page \<pid> in the cache
    lifetime calculation of page \<page-id>, add the following TypoScript:

    **EXT:site_package/Configuration/Sets/Main/setup.typoscript**

    ```typoscript
    config.cache.<page-id> = <table name>:<storage-pid>
    ```

    Multiple record sources can be added as a comma-separated list. See
    [examples](https://docs.typo3.org/permalink/t3tsref:setup-config-cache@main).

    Use the keyword "all" instead of a \<page-id> to take all records
    from all pages into account for the cache lifetime calculation.

    Use the keyword "current" instead of a \<storage-pid> to take only records
    on the current page into account for the cache lifetime calculation.

**cache_clearAtMidnight**

-   **cache_clearAtMidnight**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`

    This setting ensures that the cache expires at midnight on the day that the
    page is scheduled to expire.

**cache_period**

-   **cache_period**

    -   *Type:* [integer](https://docs.typo3.org/permalink/t3tsref:data-type-integer@main)
    -   *Default:* `86400` *(= 24 hours)*

    The number of seconds a page can remain in the cache.

    This value is overridden by the value in the page record
    `field="cache_timeout"` if that value is greater than zero.

**contentObjectExceptionHandler**

-   **contentObjectExceptionHandler**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`
    -   *Example:* :ref: `setup-config-contentObjectExceptionHandler`

    Exceptions which occur during the rendering of content objects (typically plugins)
    are caught by default in a production context. An error message
    is displayed with the rendered output.

    If there is an exception, the page will remain available while the section of the page
    that produces the error (i.e. throws an exception) will show a configurable error message.
    By default the error message contains a random code referencing
    the exception and the error is logged by the [logging framework](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Logging/Index.html#logging)
    for developer reference.

    > [!IMPORTANT]
    > Instead of a whole page breaking when an exception occurs, an error message
    > is displayed just in the part of the page that is broken.
    > Be aware that a page displaying an error message can get cached.

    To get rid of the error message, the error needs to be fixed
    and the cache must be cleared for the page.

**debug**

-   **debug**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If set, debug information for the TypoScript code is sent.
    This applies to menu objects and parse-time output.
    The parse-time will be sent in HTTP response header `X-TYPO3-Parsetime`.

**disableAllHeaderCode**

-   **disableAllHeaderCode**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`
    -   *Example:* [Provide JSON and disable HTML headers](https://docs.typo3.org/permalink/t3tsref:setup-config-disableallheadercode@main)

    If this is not set or set to `0`, the [PAGE object type in TypoScript](https://docs.typo3.org/permalink/t3tsref:page@main)
    outputs a HTML skeleton, see [Output of the PAGE object](https://docs.typo3.org/permalink/t3tsref:page-output@main).

    To disable the default behaviour set `disableAllHeaderCode = 1`.
    The page then consists of only the cObject array
    (1,2,3,4...) output of the [PAGE object type in TypoScript](https://docs.typo3.org/permalink/t3tsref:page@main).

    Use this feature for templates for content types other than HTML,
    for example images, RSS-feeds or ajax requests in an
    XML or JSON format.

    This property can also be used to generate complete HTML pages,
    including the `<html>` and `<body>` tags.

**disableBodyTag**

-   **disableBodyTag**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`

    If this option is set, the TYPO3 core will not generate the
    opening `<body ...>` part of the body tag. The closing `</body>`
    is not affected and will still be generated.

    `disableBodyTag` takes precedence over
    `bodyTagCObject`, `bodyTag` and
    `bodyTagAdd` in the [PAGE object type in TypoScript](https://docs.typo3.org/permalink/t3tsref:page@main) properties. If
    `config.disableBodyTag = 1` then the other settings are ignored
    and won't have any effect.

**disableCanonical**

-   **disableCanonical**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If the SEO system extension is installed, canonical tags are generated
    to prevent duplicate content. A good canonical is added
    in many cases by default. For edge cases, you might want to disable the
    rendering of this tag by setting it to `1`.

**disableHrefLang**

-   **disableHrefLang**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If the SEO system extension is installed, hreflang tags are generated
    in multi-language setups. By settings this option to `1`
    the rendering of the tags will be skipped.

**disablePrefixComment**

-   **disablePrefixComment**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If set, stdWrap [](https://docs.typo3.org/permalink/t3tsref:stdwrap-prefixcomment@main) will be disabled, thus
    preventing any potentially revealing and space-consuming comments in the HTML
    source code.

**disablePreviewNotification**

-   **disablePreviewNotification**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`

    Disables the "preview" notification box.

**disableLanguageHeader**

-   **disableLanguageHeader**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`

    TYPO3 by default sends a `Content-language: XX` HTTP header,
    where "XX" is the ISO code of the relevant language. The
    value is based on the language defined in the
    [Site Configuration](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/Index.html#sitehandling).

    If `config.disableLanguageHeader` is set, this header will not be sent.

**doctype**

-   **doctype**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)

    If set, then a document type declaration (and an XML prologue) will be
    generated. The value can either be a complete doctype or one of the
    following keywords:

    -   **`xhtml_trans`**

        for the XHTML 1.0 Transitional doctype.

    -   **`xhtml_strict`**

        for the XHTML 1.0 Strict doctype.

    -   **`xhtml_basic`**

        for the XHTML basic doctype.

    -   **`xhtml_11`**

        for the XHTML 1.1 doctype.

    -   **`xhtml+rdfa_10`**

        for the XHTML+RDFa 1.0 doctype.

    -   **`html5`**

        for the HTML5 doctype.

    -   **`none`**

        for *no* doctype.

    See [config.htmlTag_setParams](https://docs.typo3.org/permalink/t3tsref:setup-config-htmltag-setparams@main)
    for more details on the effect on the HTML tag.

    It defaults to the HTML 5 doctype:

    ```html
    <!DOCTYPE html>
    ```

**enableContentLengthHeader**

-   **enableContentLengthHeader**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `1`

    If set, the header "content-length: \[bytes of content\]" is sent.

    This is disabled if a backend user is logged in. The reason is
    that the content length header cannot include the length of these
    objects and the content-length will truncate the length of the
    document in some browsers.

**extTarget**

-   **extTarget**

    -   *Type:* target
    -   *Default:* `_top`

    Default external target. Used by [typolink](https://docs.typo3.org/permalink/t3tsref:typolink@main) if no extTarget is set.

**fileTarget**

-   **fileTarget**

    -   *Type:* target

    Default file link target. Used by [typolink](https://docs.typo3.org/permalink/t3tsref:typolink@main) if no fileTarget is set.

**forceAbsoluteUrls**

-   **forceAbsoluteUrls**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`

    If this option is set, all links, image references or assets
    previously built with a relative or absolute path (for example,
    `/fileadmin/my-pdf.pdf`) will be rendered as absolute URLs
    with the site prefix / current domain.

    An example of a possible use case is generating a static
    version of a TYPO3 site for sending a page via email.

    > [!NOTE]
    > Setting this option will override [config.absRefPrefix](https://docs.typo3.org/permalink/t3tsref:setup-config-absrefprefix@main) and any typolink
    > [forceAbsoluteUrl](https://docs.typo3.org/permalink/t3tsref:typolink-forceabsoluteurl@main) options.

**forceTypeValue**

-   **forceTypeValue**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    Force the `&type` value of TYPO3 generated links to a specific value
    (except if overruled by local `forceTypeValue` values).

    This is useful if you have a template with special content, for example
    `&type=95`, but still want to keep your targets neutral. Then you can
    set your targets to blank and this value to your required type value.

**headerComment**

-   **headerComment**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)

    This content is added above the "TYPO3 Content Management Framework"
    comment in the \<head> page section. Use this to insert text
    like "Programmed by My-Agency".

**htmlTag.attributes.\[attribute\]**

-   **htmlTag.attributes.\[attribute\]**

    -   *Type:* string / [stdWrap](https://docs.typo3.org/permalink/t3tsref:stdwrap)
    -   *Example:* setup-config-htmltag-attributes

    > [!NOTE]
    > **Changed in version 14.0**
    >
    > It is now possible to use [stdWrap](https://docs.typo3.org/permalink/t3tsref:stdwrap)
    > options as a subkey for an attribute, for example,  [userFunc](https://docs.typo3.org/permalink/t3tsref:confval-parsefunc-userfunc@main),
    > [override](https://docs.typo3.org/permalink/t3tsref:confval-stdwrap-override@main) and
    > [Data / getText](https://docs.typo3.org/permalink/t3tsref:data-type-gettext@main).

    Sets the `<html>` tag attributes on the page. Allows attributes to
    be customized and overridden using TypoScript without having to re-add
    attributes generated by siteHandling.

    This property supersedes the previous `config.htmlTag_setParams` option by providing
    a more flexible API to add attributes.

    ```typoscript
    config.htmlTag.attributes.my-attribute = 123
    ```

    ```typoscript
    config.htmlTag.attributes.my-attribute = 123
    config.htmlTag.attributes.my-attribute.userFunc = MyVendor\MyExtension\HtmlTagEnhancer->overrideMyAttribute
    ```

**htmlTag_setParams**

-   **htmlTag_setParams**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Example:* [htmlTag_setParams example](https://docs.typo3.org/permalink/t3tsref:setup-config-htmltag-setparams@main)

    Sets the `<html>` tag attributes on the page. If you set
    [Properties of 'config'](https://docs.typo3.org/permalink/t3tsref:setup-config-doctype@main) to a keyword that enables XHTML then some
    attributes will already be set. This property allows you to override preset
    attributes with your own content.

    **Special:** If you set it to "none" then setting attributes is no longer
    possible.

    If you have set `htmlTag.attributes` this property (`htmlTag_setParams`)
    will not have any effect.

**htmlTag_stdWrap**

-   **htmlTag_stdWrap**

    -   *Type:* [](https://docs.typo3.org/permalink/t3tsref:stdwrap)

    Modify the `<html>` tag with stdWrap functionality. Use
    this property to extend or override this tag.

**index_descrLgd**

-   **index_descrLgd**

    -   *Type:* [integer](https://docs.typo3.org/permalink/t3tsref:data-type-integer@main)
    -   *Default:* `200`

    This indicates how many chars to preserve in the description of an
    indexed page. This can be used in search result output.

**index_enable**

-   **index_enable**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    Enables cached pages to be indexed.

    Automatically enabled when `indexed_search` is enabled.

**index_externals**

-   **index_externals**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If set, external media linked to on pages is indexed.

    Automatically enabled when `indexed_search` is enabled.

**index_metatags**

-   **index_metatags**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `1`

    This allows the indexing of metatags to be switched on or off. It is
    switched on by default.

**inlineStyle2TempFile**

-   **inlineStyle2TempFile**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `1`
    -   *Example:* [inlineStyle2TempFile example](https://docs.typo3.org/permalink/t3tsref:setup-config-inlinestyle2tempfile@main)

    If set, the inline styles TYPO3 controls in the core are written to
    the `typo3temp/assets/css/stylesheet\_[hashstring].css` file and
    the header then contains just a link to the stylesheet.

    The file hash is based on the content of the styles.

**intTarget**

-   **intTarget**

    -   *Type:* target

    Default internal target. Used by [typolink](https://docs.typo3.org/permalink/t3tsref:typolink@main) if no target is set.

**linkSecurityRelValue**

-   **linkSecurityRelValue**

    -   *Type:* `noreferrer` (default) or `noopener`

    > [!NOTE]
    > **New in version 14.2**

    Define global `rel` attribute for external links. This can be changed
    from the default behavior `noreferrer` to less strict option `noopener`.
    Other values are not allowed and will fall back to the default behavior.

    The specified string is added to the `rel="..."` attribute of external
    links. If the link already contains a valid attribute from another
    source (for example added manually), it remains unchanged.

**linkVars**

-   **linkVars**

    -   *Type:* list
    -   *Example:* [Add &print parameter to all links](https://docs.typo3.org/permalink/t3tsref:setup-config-linkvars@main)

    `HTTP_GET_VARS`, which should be passed on with links in TYPO3.
    This is compiled into a string.

    The values are rawurlencoded in PHP.

    You can specify a range of valid values by appending a () after each
    value. If the range does not match, the variable won't be appended to
    links. This is very important to prevent that the cache system gets
    flooded with forged values.

    The range can contain one of the following values:

    -   **`[a]-[b]`**

        A range of allowed integer values

    -   **`int`**

        Only integer values are allowed

    -   **`[a]|[b]|[c]`**

        A list of allowed strings (whitespace will be removed)

    -   **`/[regex]/`**

        Match against a regular expression (PCRE style)

    You can use the pipe character (|) to access nested properties.

    > [!NOTE]
    > Do **not** include the `type` and `L` parameters in the linkVars
    > list as this will result in unexpected behavior.

**message_preview**

-   **message_preview**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)

    Alternative message in HTML that appears when the preview function is
    active.

**message_preview_workspace**

-   **message_preview_workspace**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Example:* [Customize workspace display box](https://docs.typo3.org/permalink/t3tsref:setup-config-message-preview-workspace@main)

    Alternative message in HTML that appears when the preview function is
    active in a draft workspace. You can use sprintf() placeholders for
    Workspace title (first) and number (second).

**moveJsFromHeaderToFooter**

-   **moveJsFromHeaderToFooter**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If set, all JavaScript (includes and inline) will be moved to the
    bottom of the HTML document, which is after the content and before the
    closing body tag.

**MP_defaults**

-   **MP_defaults**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Syntax:* `[id],[id],... : [MP-var] | [id],[id],... : [MP-var] | ...`
    -   *Example:* [Define mounting point defaults for certain pages](https://docs.typo3.org/permalink/t3tsref:setup-config-mp-defaults@main)

    Allows you to set a list of page id numbers which will always have a
    certain "&MP=..." parameter added.

    Imagine you have a TYPO3 site with several mount points, and you need
    certain pages to always include a specific mount point parameter for
    correct content rendering. By configuring :typoscript`MP_defaults`, you
    can ensure consistency and reduce the risk of broken links or incorrect
    content being displayed due to missing parameters.

**MP_disableTypolinkClosestMPvalue**

-   **MP_disableTypolinkClosestMPvalue**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If set, the [typolink](https://docs.typo3.org/permalink/t3tsref:typolink@main) function will not try to find the closest MP
    value for the id.

**MP_mapRootPoints**

-   **MP_mapRootPoints**

    -   *Type:* list of PIDs / [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)

    Defines a list of ID numbers from which the MP-vars are automatically
    calculated for the branch.

    The result is used just like [MP_defaults](https://docs.typo3.org/permalink/t3tsref:setup-config-mp-defaults@main) are used to
    find MP-vars if none have been specified prior to the call to
    `TYPO3CMSFrontendTypolinkPageLinkBuilder`.

    You can specify `root` as a special keyword in the list of IDs and
    that will create a map-tree for the whole site (but this may be VERY
    processing intensive if there are many pages!).

    The order of IDs can be significant - any ID in a branch
    which has already been processed (by a previous ID root point) will not be
    processed again.

    Configured IDs have to be the uids of actual mount point pages, not the targets.

**namespaces.\[identifier\]**

-   **namespaces.\[identifier\]**

    -   *Type:* string :Example:setup-config-namespaces

    This property enables you to add XML namespaces (`xmlns`) to the `<html>`
    tag. This is especially useful if you want to add RDFa or microformats
    to your HTML.

**no_cache**

-   **no_cache**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`

    If this is set to `1`, it disables the `pages` cache, meaning that the
    rendered result/response will not be saved to cache.

    If set to `0`, it is ignored. The rendered result (e.g. full html of a page)
    is stored in the `pages` cache.

    Other parameters may have set it to true for other reasons.
    Note that setting this to `1` doesn't disable other TYPO3 caches.
    Instead of setting `config.no_cache` you can change dynamic
    (non-cacheable) content from [USER](https://docs.typo3.org/permalink/t3tsref:cobj-user@main) to [USER_INT](https://docs.typo3.org/permalink/t3tsref:cobj-user@main)
    ([COA](https://docs.typo3.org/permalink/t3tsref:cobj-coa@main) to [COA_INT](https://docs.typo3.org/permalink/t3tsref:cobj-coa@main)).

    For more information about cache types see the
    [cache types chapter](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/CachingFramework/Architecture/Index.html#caching-architecture-core).

**noPageTitle**

-   **noPageTitle**

    -   *Type:* [integer](https://docs.typo3.org/permalink/t3tsref:data-type-integer@main)
    -   *Default:* `0`
    -   *Example:* [Set a custom page renderer template](https://docs.typo3.org/permalink/t3tsref:setup-config-pagerenderertemplatefile@main)

    If you only want to have the site name (from the template record) in
    your `<title>` tag, set this to 1. If the value is 2 then the `<title>`
    tag is not output.

    Please note that this tag is required for (X)HTML compliant
    output, so you should only disable this tag if you have already
    generated it manually.

**pageRendererTemplateFile**

-   **pageRendererTemplateFile**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Default:* file:`EXT:core/Resources/Private/Templates/PageRenderer.html`

    Sets the template for page renderer class
    `\TYPO3\CMS\Core\Page\PageRenderer`.

**pageTitle**

-   **pageTitle**

    -   *Type:* [](https://docs.typo3.org/permalink/t3tsref:stdwrap)

    stdWrap for the page title. This option will be executed *after* all
    other processing options like [Properties of 'config'](https://docs.typo3.org/permalink/t3tsref:setup-config-pagetitlefirst@main).

**pageTitleFirst**

-   **pageTitleFirst**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* `0`
    -   *Example:* [Reorder the default page title providers](https://docs.typo3.org/permalink/t3tsref:setup-config-pagetitleproviders@main)

    TYPO3 by default prints title tags in the format "website: page
    title".

    If `pageTitleFirst` is set (and if the page title is printed), then the
    page title will be printed before the template title, i.e. "page title: website".

**pageTitleProviders**

-   **pageTitleProviders**

    -   *Type:* array

    In order to set page titles, an API is available. The API uses
    `PageTitleProviders` to set the page title based on the page record and the content on that page.

    Based on the priority of providers,
    `PageTitleProviderManager` will
    check the providers to see if they have titles. It will start with the
    highest priority `PageTitleProviders`.

**pageTitleSeparator**

-   **pageTitleSeparator**

    -   *Type:* array
    -   *Default:* `:` *(colon with following space)*
    -   *Example:* [Use custom separators between page title parts](https://docs.typo3.org/permalink/t3tsref:setup-config-pagetitleseparator@main)

    The symbols ouput in the title tag between the website
    name and the page title. If `pageTitleSeparator` is set, but *no*
    sub-properties are defined, then a space will be added to the end of the
    separator. stdWrap can be used to adjust whitespace at the beginning and
    end of the separator.

**recordLinks**

-   **recordLinks**

    -   *Type:* array of link configurations

    **Frontend TypoScript definition for identifier `my_content`**

    ```typoscript
    config.recordLinks.my_content {
        // If the record is hidden do not force link generation
        forceLink = 0

        typolink {
            // pages.uid to be used to render result (basically it contains the rendering plugin)
            parameter = 234
            // field values of tx_myextension_content record with uid 123
            additionalParams.data = field:uid
            additionalParams.wrap = &tx_myextension[uid]= | &tx_myextension[action]=show
        }
    }
    ```

**removeDefaultCss**

-   **removeDefaultCss**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Example:* [Remove default external JavaScript and all default CSS](https://docs.typo3.org/permalink/t3tsref:setup-config-removedefaultjs@main)

    Remove CSS generated by the [\_CSS_DEFAULT_STYLE](https://docs.typo3.org/permalink/t3tsref:setup-plugin-css-default-style@main) extension property.
    (`_CSS_DEFAULT_STYLE` outputs a set of default styles for
    extensions with frontend plugins)

**removeDefaultJS**

-   **removeDefaultJS**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main) / [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Example:* [Remove default external JavaScript and all default CSS](https://docs.typo3.org/permalink/t3tsref:setup-config-removedefaultjs@main)

    If set, default JavaScript in the header will be removed.

    The default JavaScript decrypts email addresses.

    **Special case:** If the value is set to the string `external`, then the default
    JavaScript is written to a temporary file and included in that file.
    See [inlineStyle2TempFile example](https://docs.typo3.org/permalink/t3tsref:setup-config-inlinestyle2tempfile@main).

**sendCacheHeaders**

-   **sendCacheHeaders**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)

    If set, TYPO3 will output cache-control headers to the client based
    on whether the page was internally cached. This feature allows
    client browsers and/or reverse proxies to take load off TYPO3
    websites.

    The conditions for allowing client caching are:

    -   page was cached
    -   No `*_INT` or `*_EXT` objects are on the page (e.g. [USER and USER_INT](https://docs.typo3.org/permalink/t3tsref:cobj-user@main))
    -   No frontend users are logged in
    -   No backend users are logged in

    If these conditions are met, the headers sent are:

    -   Last-Modified \[SYS_LASTCHANGED of page id\]
    -   Expires \[expire time of page cache\]
    -   ETag \[md5 of content\]
    -   Cache-Control: max-age: \[seconds til expiretime\]
    -   Pragma: public

    If caching is not allowed, the following headers are sent to avoid client
    caching:

    -   Cache-Control: private, no-store

    Notice that enabling browser caches means you will have to consider how
    log files are written because when a page is cached on the client it
    will not invoke a request to the webserver, thus not writing the
    request to a log. There should be ways to circumvent these problems
    but they are outside the domain of TYPO3.

    **Tip:** Enabling cache-control headers might confuse editors seeing
    old content served from the browser cache. "Shift-Reload" will bypass
    both browser- and reverse-proxy caches and make TYPO3 regenerate
    the page. A good tip worth knowing about!

**sendCacheHeadersForSharedCaches**

-   **sendCacheHeadersForSharedCaches**

    -   *Type:* `auto`, `force`, or empty

    When working with proxies, keeping a cached version for a period of
    time and answering requests from the client will take load
    off TYPO3 / the webserver, while at the same time notifying the
    client not to cache the response in the browser cache.

    This is achieved by setting
    `config.sendCacheHeadersForSharedCaches = auto`.

    When this option is enabled, TYPO3 evaluates the current TYPO3 frontend
    request to see if it is being executed behind a reverse proxy. If so, TYPO3
    sends the following HTTP Response Headers as a cached response:

    ```plaintext
    Expires: Thu, 26 Aug 2024 08:52:00 GMT
    ETag: "d41d8cd98f00b204ecs00998ecf8427e"
    Cache-Control: max-age=0, s-maxage=86400
    Pragma: public
    ```

    When `config.sendCacheHeadersForSharedCaches = force` the reverse
    proxy evaluation can be omitted. Use for local webserver internal
    caches.

    See [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)
    for details and whether your reverse proxy supports this directive.

**showWebsiteTitle**

-   **showWebsiteTitle**

    -   *Type:* [boolean](https://docs.typo3.org/permalink/t3tsref:data-type-boolean@main)
    -   *Default:* 1

    This option can be used to specify whether the website title defined in
    the [site configuration](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/Index.html#sitehandling) should be added
    to the page title (used for the `<title>` tag, for example).

    By default, the website title is added. To omit the website title, set the
    option to `0`.

**spamProtectEmailAddresses**

-   **spamProtectEmailAddresses**

    -   *Type:* `-10` to `10`
    -   *Example:* [Spam protect email addresses automatically](https://docs.typo3.org/permalink/t3tsref:setup-config-spamprotectemailaddresses-lastdotsubst@main)

    If set, all email addresses in typolinks will be encrypted so
    that it is harder for spam bots to detect them.

    If you set this value to a number then the encryption method is an
    offset of character values. If you set this value to "-2" all
    characters will have their ASCII value offset by "-2". It works by adding
    a small piece of JavaScript code to every web page.

    (It is recommended to set the option to a value between -5 to 1 since
    setting it to >= 2 means a "z" is converted to "|" which is a special
    character in TYPO3 table syntax – which might lead to confusion.)

    Default JavaScript needs to be enabled.
    (see [removeDefaultJS](https://docs.typo3.org/permalink/t3tsref:setup-config-removedefaultjs@main))

**spamProtectEmailAddresses_atSubst**

-   **spamProtectEmailAddresses_atSubst**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Default:* `(at)`
    -   *Example:* [Spam protect email addresses automatically](https://docs.typo3.org/permalink/t3tsref:setup-config-spamprotectemailaddresses-lastdotsubst@main)

    Substitute label for the at-sign (`@`).

**spamProtectEmailAddresses_lastDotSubst**

-   **spamProtectEmailAddresses_lastDotSubst**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Default:* `.` *(just a simple dot)*
    -   *Example:* [Spam protect email addresses automatically](https://docs.typo3.org/permalink/t3tsref:setup-config-spamprotectemailaddresses-lastdotsubst@main)

    Substitute label for the last dot in the email address.

**tx\_\[extension key with no underscores\]\_\[\*\]**

-   **tx\_\[extension key with no underscores\]\_\[\*\]**

    -   *Type:* array
    -   *Example:* [Define configuration for custom namespaces](https://docs.typo3.org/permalink/t3tsref:setup-config-tx-extension-key-with-no-underscores@main)

    Configuration space for extensions. This can be used for plugins that
    have TypoScript configuration, but that don't display anything in the frontend
    (i.e. don't receive their configuration as an argument from the frontend
    rendering process).

**typolinkLinkAccessRestrictedPages**

-   **typolinkLinkAccessRestrictedPages**

    -   *Type:* [integer](https://docs.typo3.org/permalink/t3tsref:data-type-integer@main) (page id) / keyword "NONE"
    -   *Example:* [Define custom styling for access restricted page links](https://docs.typo3.org/permalink/t3tsref:setup-config-typolinklinkaccessrestrictedpages@main)

    If set, typolinks pointing to access restricted pages will still link
    to the page even though the page cannot be accessed. If the value of
    this setting is an integer it will be interpreted as a page id to
    which the link will be directed.

    If the value is `NONE`, the original link to the page will be kept
    although it will generate a page-not-found situation (which could, of
    course, be properly handled by the page-not-found handler and present
    a nice login form).

    See [showAccessRestrictedPages](https://docs.typo3.org/permalink/t3tsref:confval-menu-common-properties-showaccessrestrictedpages@main)
    for menu objects as well (similar feature for menus)

**typolinkLinkAccessRestrictedPages.ATagParams**

-   **typolinkLinkAccessRestrictedPages.ATagParams**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Example:* [Define custom styling for access restricted page links](https://docs.typo3.org/permalink/t3tsref:setup-config-typolinklinkaccessrestrictedpages@main)

    `typolinkLinkAccessRestrictedPages.ATagParams` Add custom attributes to
    the anchor tag.

**typolinkLinkAccessRestrictedPages_addParams**

-   **typolinkLinkAccessRestrictedPages_addParams**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)
    -   *Example:* [Define custom styling for access restricted page links](https://docs.typo3.org/permalink/t3tsref:setup-config-typolinklinkaccessrestrictedpages@main)

    See [Define custom styling for access restricted page links](https://docs.typo3.org/permalink/t3tsref:setup-config-typolinklinkaccessrestrictedpages@main) above.

**typolinkLinkAccessRestrictedPages_xmlprologue**

-   **typolinkLinkAccessRestrictedPages_xmlprologue**

    -   *Type:* [string](https://docs.typo3.org/permalink/t3tsref:data-type-string@main)

    If empty (not set) then the default XML 1.0 prologue is set, when the
    doctype is set to a known keyword (e.g. `xhtml_11`):

    **Output**

    ```none
    <?xml version="1.0" encoding="utf-8">
    ```

    If set to one of the following keywords then a standard prologue will
    be set:

    -   **`xml_10:`**

        XML 1.0 prologue (see above)

    -   **`xml_11:`**

        XML 1.1 prologue

    -   **`none:`**

        The default XML prologue is *not* set.

    Any other string is used

## Examples of configuration in TypoScript using `config.`

-   [config cache examples](https://docs.typo3.org/permalink/t3tsref:config-cache-examples@main)
-   [contentObjectExceptionHandler example](https://docs.typo3.org/permalink/t3tsref:contentobjectexceptionhandler-example@main)
-   [Provide JSON and disable HTML headers](https://docs.typo3.org/permalink/t3tsref:provide-json-and-disable-html-headers@main)
-   [HTML tag attributes example](https://docs.typo3.org/permalink/t3tsref:html-tag-attributes-example@main)
-   [htmlTag_setParams example](https://docs.typo3.org/permalink/t3tsref:htmltag-setparams-example@main)
-   [inlineStyle2TempFile example](https://docs.typo3.org/permalink/t3tsref:inlinestyle2tempfile-example@main)
-   [Add &print parameter to all links](https://docs.typo3.org/permalink/t3tsref:add-print-parameter-to-all-links@main)
-   [Customize workspace display box](https://docs.typo3.org/permalink/t3tsref:customize-workspace-display-box@main)
-   [Define mounting point defaults for certain pages](https://docs.typo3.org/permalink/t3tsref:define-mounting-point-defaults-for-certain-pages@main)
-   [Define Dublin Core Metadata Element Set (dc) xmlns namespace](https://docs.typo3.org/permalink/t3tsref:define-dublin-core-metadata-element-set-dc-xmlns-namespace@main)
-   [Set a custom page renderer template](https://docs.typo3.org/permalink/t3tsref:set-a-custom-page-renderer-template@main)
-   [Reorder the default page title providers](https://docs.typo3.org/permalink/t3tsref:reorder-the-default-page-title-providers@main)
-   [Use custom separators between page title parts](https://docs.typo3.org/permalink/t3tsref:use-custom-separators-between-page-title-parts@main)
-   [Remove default external JavaScript and all default CSS](https://docs.typo3.org/permalink/t3tsref:remove-default-external-javascript-and-all-default-css@main)
-   [Spam protect email addresses automatically](https://docs.typo3.org/permalink/t3tsref:spam-protect-email-addresses-automatically@main)
-   [Define configuration for custom namespaces](https://docs.typo3.org/permalink/t3tsref:define-configuration-for-custom-namespaces@main)
-   [Define custom styling for access restricted page links](https://docs.typo3.org/permalink/t3tsref:define-custom-styling-for-access-restricted-page-links@main)

### config cache examples

-   **Demonstrates:**

    -   [config.cache](https://docs.typo3.org/permalink/t3tsref:confval-config-cache@main)

This includes the `fe_users` records on page 2 in the cache lifetime
calculation for page 10:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.cache.10 = fe_users:2
```

This includes records from multiple sources; `fe_users`
records on page 2 and `tt_new` records on page 11:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.cache.10 = fe_users:2,tt_news:11
```

Take `fe_users` records on storage page 2 into account for the cache lifetime of all
pages:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.cache.all = fe_users:2
```

Each page's cache lifetime is affected if fe_users stored on the same page are
changed:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.cache.all = fe_users:current
```

### contentObjectExceptionHandler example

-   **Demonstrates:**

    -   [config.contentObjectExceptionHandler](https://docs.typo3.org/permalink/t3tsref:confval-config-contentobjectexceptionhandler@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
# Use 1 for the default exception handler (enabled by default in production context)
config.contentObjectExceptionHandler = 1

# Use a class name for individual exception handlers
config.contentObjectExceptionHandler = TYPO3\CMS\Frontend\ContentObject\Exception\ProductionExceptionHandler

# Customize the error message. A randomly generated code is replaced within the message if needed.
config.contentObjectExceptionHandler.errorMessage = Oops an error occurred. Code: %s

# Configure exception codes which will not be handled, but bubble up again (useful for temporary fatal errors)
tt_content.login.20.exceptionHandler.ignoreCodes.10 = 1414512813

# Disable the exception handling for an individual plugin/ content object
tt_content.login.20.exceptionHandler = 0

# ignoreCodes and errorMessage can be both configured globally …
config.contentObjectExceptionHandler.errorMessage = Oops an error occurred. Code: %s
config.contentObjectExceptionHandler.ignoreCodes.10 = 1414512813

# … or locally for individual content objects
tt_content.login.20.exceptionHandler.errorMessage = Oops an error occurred. Code: %s
tt_content.login.20.exceptionHandler.ignoreCodes.10 = 1414512813
```

### Provide JSON and disable HTML headers

A page type providing JSON:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
json = PAGE
json {
    typeNum = 1617455215
    10 =< tt_content.list.20.tx_myextension_myjsonplugin
    config {
        disableAllHeaderCode = 1
        additionalHeaders.10.header = Content-type:application/json
    }
}
```

### HTML tag attributes example

-   **Demonstrates:**

    -   [config.htmlTag.attributes](https://docs.typo3.org/permalink/t3tsref:confval-config-htmltag-attributes@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.htmlTag.attributes.class = no-js
```

Results in :

**Example output**

```html
<html lang="fr" class="no-js">
```

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.htmlTag.attributes.amp =
```

Results in :

**Example output**

```html
<html lang="fr" amp>
```

> [!WARNING]
> If you are using `htmlTag.attributes` the property
> [htmlTag_setParams example](https://docs.typo3.org/permalink/t3tsref:setup-config-htmltag-setparams@main) will not have any effect.

> [!NOTE]
> Please note that the `lang` attribute in these examples are auto-generated by
> [site handling](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/Index.html#sitehandling), depending on the value added there.

### htmlTag_setParams example

-   **Demonstrates:**

    -   [config.htmlTag_setParams](https://docs.typo3.org/permalink/t3tsref:confval-config-htmltag-setparams@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US"
```

### inlineStyle2TempFile example

-   **Demonstrates:**

    -   [config.inlineStyle2TempFile](https://docs.typo3.org/permalink/t3tsref:confval-config-inlinestyle2tempfile@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.inlineStyle2TempFile = 0
```

### Add `&print` parameter to all links

-   **Demonstrates:**

    -   [config.linkVars](https://docs.typo3.org/permalink/t3tsref:confval-config-linkvars@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.linkVars = print
```

This will add `&print=[print-value]` to all links in TYPO3.

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.linkVars = tracking|green(0-5)
```

In the above configuration, GET parameter `&tracking[green]=3` would
be kept, but `tracking[blue]` would not be kept.

### Customize workspace display box

-   **Demonstrates:**

    -   [config.message_preview_workspace](https://docs.typo3.org/permalink/t3tsref:confval-config-message-preview-workspace@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.message_preview_workspace = <div class="previewbox">Displaying workspace named "%s" (number %s)!</div>
config.message_preview_workspace = <div class="previewbox">Displaying workspace number %2$s named "%1$s"!</div>
```

### Define mounting point defaults for certain pages

-   **Demonstrates:**

    -   [config.MP_defaults](https://docs.typo3.org/permalink/t3tsref:confval-config-mp-defaults@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.MP_defaults = 36,37,48 : 2-207
```

This will by default add `&MP=2-207` to all links pointing to pages
36,37 and 48.

### Define Dublin Core Metadata Element Set (dc) xmlns namespace

-   **Demonstrates:**

    -   [config.namespaces](https://docs.typo3.org/permalink/t3tsref:confval-config-namespaces@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.namespaces.dc = http://purl.org/dc/elements/1.1/
config.namespaces.foaf = http://xmlns.com/foaf/0.1/
```

This configuration will result in an `<html>` tag like:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
<html xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:foaf="http://xmlns.com/foaf/0.1/">
```

### Set a custom page renderer template

-   **Demonstrates:**

    -   [config.pageRendererTemplateFile](https://docs.typo3.org/permalink/t3tsref:confval-config-pagerenderertemplatefile@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.pageRendererTemplateFile = EXT:my_extension/Resources/Private/Templates/TestPagerender.fluid.html
```

### Reorder the default page title providers

-   **Demonstrates:**

    -   [config.pageTitleProviders](https://docs.typo3.org/permalink/t3tsref:confval-config-pagetitleproviders@main)

By default, TYPO3 ships with two providers:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.pageTitleProviders {
    record {
        provider = TYPO3\CMS\Core\PageTitle\RecordPageTitleProvider
    }
    seo {
        provider = TYPO3\CMS\Seo\PageTitle\SeoTitlePageTitleProvider
        before = record
    }
}
```

The order of providers is based on the `before` and
`after` parameters. If you want a provider
to be handled before a specific other provider, set that provider in
`before` and `after`.

> [!NOTE]
> The `seo` PageTitleProvider is only available if the SEO system
> extension is installed.

You can find information about creating your own PageTitleProviders in the section
[PageTitle API](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Seo/PageTitleApi.html#pagetitle).

### Use custom separators between page title parts

-   **Demonstrates:**

    -   [config.pageTitleSeparator](https://docs.typo3.org/permalink/t3tsref:confval-config-pagetitleseparator@main)

This produces a title tag with the format "website . page title":

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.pageTitleSeparator = .
```

This produces a title tag with the format "website - page title":

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.pageTitleSeparator = -
config.pageTitleSeparator.noTrimWrap = | | |
```

This produces a title tag with the format "website\*page title":

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.pageTitleSeparator = *
config.pageTitleSeparator.noTrimWrap = |||
```

If you want to remove the web page title from the title, choose a separator that is not included in the web page title.
Then split the title from that character and return the second part only:

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.pageTitleSeparator = *
config.pageTitle.stdWrap {
    split {
        token = *
        returnKey = 1
    }
}
```

### Remove default external JavaScript and all default CSS

-   **Demonstrates:**

    -   [config.removeDefaultJS](https://docs.typo3.org/permalink/t3tsref:confval-config-removedefaultjs@main)
    -   [config.removeDefaultCss](https://docs.typo3.org/permalink/t3tsref:confval-config-removedefaultcss@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config  {
    removeDefaultJS = external
    removeDefaultCss = 1
}
```

### Spam protect email addresses automatically

-   **Demonstrates:**

    -   [config.spamProtectEmailAddresses](https://docs.typo3.org/permalink/t3tsref:confval-config-spamprotectemailaddresses@main)
    -   [config.spamProtectEmailAddresses_atSubst](https://docs.typo3.org/permalink/t3tsref:confval-config-spamprotectemailaddresses-atsubst@main)
    -   [config.spamProtectEmailAddresses_lastDotSubst](https://docs.typo3.org/permalink/t3tsref:confval-config-spamprotectemailaddresses-lastdotsubst@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config {
    spamProtectEmailAddresses = -2
    spamProtectEmailAddresses_atSubst = (at)
    spamProtectEmailAddresses_lastDotSubst = (dot)
}
```

### Define configuration for custom namespaces

-   **Demonstrates:**

    -   [config.tx_myextension](https://docs.typo3.org/permalink/t3tsref:confval-config-tx-extension-key-with-no-underscores@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config.tx_realurl_enable = 1
config.tx_myextension.width  = 10
config.tx_myextension.length = 20
```

### Define custom styling for access restricted page links

-   **Demonstrates:**

    -   [config.typolinkLinkAccessRestrictedPages](https://docs.typo3.org/permalink/t3tsref:confval-config-typolinklinkaccessrestrictedpages@main)
    -   [config.typolinkLinkAccessRestrictedPages.ATagParams](https://docs.typo3.org/permalink/t3tsref:confval-config-typolinklinkaccessrestrictedpages-atagparams@main)
    -   [config.typolinkLinkAccessRestrictedPages_addParams](https://docs.typo3.org/permalink/t3tsref:confval-config-typolinklinkaccessrestrictedpages-addparams@main)

**EXT:site_package/Configuration/Sets/Main/setup.typoscript**

```typoscript
config {
    typolinkLinkAccessRestrictedPages = 29
    typolinkLinkAccessRestrictedPages.ATagParams = class="restricted"
    typolinkLinkAccessRestrictedPages_addParams = &return_url=###RETURN_URL###&pageId=###PAGE_ID###
}
```

Will create a link to the page with id 29 and add GET parameters with
the return URL and original page id. Additionally, CSS
class "restricted" is added to the anchor tag.

## Frontend asset concatenation and compression not supported

> [!NOTE]
> **Changed in version 14.0**
>
> TYPO3 no longer provides built-in frontend asset concatenation or
> pre-compression.

The following TypoScript options were removed and have no effect in TYPO3 v14:

-   config.concatenateCss
-   config.concatenateJs
-   config.compressCss
-   config.compressJs

Projects upgrading from earlier TYPO3 versions must replace these
runtime features with build-time asset processing (for example using
Vite, Webpack, or similar tooling).

See: [Breaking: #108055 - Removed frontend asset concatenation and compression](https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/14.0/Breaking-108055-RemovedFrontendAssetConcatenationAndCompression.html#breaking-108055-1762346705).
