Nginx configuration

Configuration file changes

This configuration example adds a named location called @sfc which replaces the usual invocation of TYPO3's index.php. The @sfc location includes all checks necessary to decide whether the current request can be handled with a static file or needs to be directed to TYPO3. If all checks pass, the try_files directive is used to find the files in typo3temp/assets/tx_staticfilecache/ and if unavailable, redirect to index.php.

In your nginx configuration you need to replace your '/' location, which probably looks like the following:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

By the following configuration:

location / {
    try_files $uri $uri/ @sfc;
}

# Special root site case. prevent "try_files $uri/" + "index" from skipping the cache
# by accessing /index.php directly
location =/ {
    recursive_error_pages on;
    error_page 405 = @sfc;
    return 405;
}

location @t3frontend {
    # Using try_files for ease of configuration demonstration here,
    # you can also fastcgi_pass directly to php here
    try_files $uri /index.php$is_args$args;
}

location @sfc {
    # Perform an internal redirect to TYPO3 if any of the required
    # conditions for StaticFileCache don't match
    error_page 405 = @t3frontend;

    # Query String needs to be empty
    if ($args != '') {
        return 405;
    }

    # We can't serve static files for logged-in BE/FE users
    if ($cookie_staticfilecache = 'typo_user_logged_in') {
        return 405;
    }

    if ($cookie_be_typo_user != '') {
        return 405;
    }

    # Ensure we redirect to TYPO3 for non GET/HEAD requests
    if ($request_method !~ ^(GET|HEAD)$ ) {
        return 405;
    }

    # Disable cache for EXT:solr indexing requests
    if ($http_x_tx_solr_iq) {
        return 405;
    }

    charset utf-8;
    default_type text/html;
    try_files /typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}/index
          /typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}
          =405;
}

location /typo3temp/assets/tx_staticfilecache {
    deny all;
}

If you activate the php generator you need to use this block accepting urls with trailing slashes only

if (!-f $document_root/typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}index.php) {
    return 405;
}

include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}/index.php;

or this block accepting urls with or without trailing slashes

if (!-f $document_root/typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}/index.php) {
    return 405;
}

include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}/index.php;

instead of

charset utf-8;
default_type text/html;
try_files /typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}/index
      /typo3temp/assets/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}
      =405;

Extension configuration

Nginx does not support .htaccess files and therefore cannot transfer HTML headers for the statically cached files. You should therefore activate the PHP generator, so that the static content is written to a PHP file via which the correct HTML headers are set.