From edd2a1c53e038d81f28fad05cd606d6dd040c93d Mon Sep 17 00:00:00 2001
From: Andreas Fernandez <a.fernandez@scripting-base.de>
Date: Mon, 4 May 2015 11:16:12 +0200
Subject: [PATCH] [TASK] Improve .htaccess files
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Improve the example .htaccess file by adding rules for caching,
MIME types and CORS. Also, the rewrite rules are extended to block
access to certain files and folders.

Additionally all rules are made compatible for Apache 2.4 as well.

Resolves: #23078
Resolves: #66235
Releases: master, 6.2
Change-Id: I629f524b5a209769601f04a74bb7434736058ab8
Reviewed-on: http://review.typo3.org/39254
Reviewed-by: Stephan Großberndt <stephan@grossberndt.de>
Tested-by: Stephan Großberndt <stephan@grossberndt.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
---
 _.htaccess                                    | 383 +++++++++++++-----
 .../sysext/about/Resources/Private/.htaccess  |  12 +-
 .../aboutmodules/Resources/Private/.htaccess  |  12 +-
 .../sysext/belog/Resources/Private/.htaccess  |  12 +-
 .../sysext/beuser/Resources/Private/.htaccess |  12 +-
 .../core/Classes/Log/Writer/FileWriter.php    |  15 +-
 .../core/Documentation/Changelog/.htaccess    |  12 +-
 typo3/sysext/core/Resources/Private/.htaccess |  12 +-
 .../Resources/Private/.htaccess               |  12 +-
 .../Classes/Service/SessionService.php        |  15 +-
 .../install/Resources/Private/.htaccess       |  12 +-
 .../fileadmin-temp-htaccess                   |  13 +-
 ...min-user_upload-temp-importexport-htaccess |  13 +-
 typo3/sysext/lang/Resources/Private/.htaccess |  12 +-
 .../taskcenter/Resources/Private/.htaccess    |  12 +-
 15 files changed, 449 insertions(+), 110 deletions(-)

diff --git a/_.htaccess b/_.htaccess
index 7944e4f05704..2ddfe42613ad 100644
--- a/_.htaccess
+++ b/_.htaccess
@@ -4,42 +4,33 @@
 #
 # This file includes settings for the following configuration options:
 #
-# - Compression via TYPO3
-# - Settings for mod_rewrite (URL-Rewriting)
-# - PHP optimisation
+# - Compression
+# - Caching
+# - MIME types
+# - Cross Origin requests
+# - Rewriting and Access
 # - Miscellaneous
+# - PHP optimisation
 #
 # If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its
 # not there already) and rename it to '.htaccess'. To make .htaccess files work, you might need to
 # adjust the 'AllowOverride' directive in your Apache configuration file.
 #
 # IMPORTANT: You may need to change this file depending on your TYPO3 installation!
+#            Consider adding this file's content to your webserver's configuration directly for speed improvement
 #
-# Lines starting with a # are treated as comment and ignored by the web server.
-#
-# You should change every occurance of TYPO3root/ to the location where you have your website in.
-# For example:
-# If you have your website located at http://mysite.com/
-# then your TYPO3root/ is just empty (remove 'TYPO3root/')
-# If you have your website located at http://mysite.com/some/path/
-# then your TYPO3root/ is some/path/ (search and replace)
-#
-# You can also use this configuration in your httpd.conf, but then you have to modify some lines,
-# see the comments (search for 'httpd.conf')
-#
-# Questions about this file go to the matching Install mailing list, see
-# http://typo3.org/documentation/mailing-lists/
+# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess
 #
 ####
 
 
-### Begin: Compression via TYPO3 ###
+### Begin: Compression ###
 
 # Compressing resource files will save bandwidth and so improve loading speed especially for users
 # with slower internet connections. TYPO3 can compress the .js and .css files for you.
 # *) Uncomment the following lines and
-# *) Set $TYPO3_CONF_VARS['BE']['compressionLevel'] = '9' for the Backend
-# *) Set $TYPO3_CONF_VARS['FE']['compressionLevel'] = '9' together with the TypoScript properties
+# *) Set $GLOBALS['TYPO3_CONF_VARS']['BE']['compressionLevel'] = 9 for the Backend
+# *) Set $GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel'] = 9 together with the TypoScript properties
 #    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.
 
 #<FilesMatch "\.js\.gzip$">
@@ -50,109 +41,313 @@
 #</FilesMatch>
 #AddEncoding gzip .gzip
 
+<IfModule mod_deflate.c>
+	# Force compression for mangled `Accept-Encoding` request headers
+	<IfModule mod_setenvif.c>
+		<IfModule mod_headers.c>
+			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
+			RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
+		</IfModule>
+	</IfModule>
+
+	# Compress all output labeled with one of the following media types
+	<IfModule mod_filter.c>
+		AddOutputFilterByType DEFLATE "application/atom+xml" \
+			"application/javascript" \
+			"application/json" \
+			"application/ld+json" \
+			"application/manifest+json" \
+			"application/rdf+xml" \
+			"application/rss+xml" \
+			"application/schema+json" \
+			"application/vnd.geo+json" \
+			"application/vnd.ms-fontobject" \
+			"application/x-font-ttf" \
+			"application/x-javascript" \
+			"application/x-web-app-manifest+json" \
+			"application/xhtml+xml" \
+			"application/xml" \
+			"font/eot" \
+			"font/opentype" \
+			"image/bmp" \
+			"image/svg+xml" \
+			"image/vnd.microsoft.icon" \
+			"image/x-icon" \
+			"text/cache-manifest" \
+			"text/css" \
+			"text/html" \
+			"text/javascript" \
+			"text/plain" \
+			"text/vcard" \
+			"text/vnd.rim.location.xloc" \
+			"text/vtt" \
+			"text/x-component" \
+			"text/x-cross-domain-policy" \
+			"text/xml"
+	</IfModule>
+
+	<IfModule mod_mime.c>
+		AddEncoding gzip              svgz
+	</IfModule>
+</IfModule>
+
 ### End: Compression via TYPO3 ###
 
 
-### Begin: Browser caching of ressource files ###
 
-# Enable long browser caching for JavaScript and CSS files.
+### Begin: Browser caching of resource files ###
 
 # This affects Frontend and Backend and increases performance.
-# You can also add other file extensions (like gif, png, jpg), if you want them to be longer cached, too.
-
-<FilesMatch "\.(js|css)$">
-  <IfModule mod_expires.c>
-    ExpiresActive on
-    ExpiresDefault "access plus 7 days"
-  </IfModule>
-  FileETag MTime Size
-</FilesMatch>
+<IfModule mod_expires.c>
+
+	ExpiresActive on
+	ExpiresDefault                                      "access plus 1 month"
+
+	ExpiresByType text/css                              "access plus 1 year"
+
+	ExpiresByType application/json                      "access plus 0 seconds"
+	ExpiresByType application/ld+json                   "access plus 0 seconds"
+	ExpiresByType application/schema+json               "access plus 0 seconds"
+	ExpiresByType application/vnd.geo+json              "access plus 0 seconds"
+	ExpiresByType application/xml                       "access plus 0 seconds"
+	ExpiresByType text/xml                              "access plus 0 seconds"
+
+	ExpiresByType image/vnd.microsoft.icon              "access plus 1 week"
+	ExpiresByType image/x-icon                          "access plus 1 week"
+
+	ExpiresByType text/x-component                      "access plus 1 month"
+
+	ExpiresByType text/html                             "access plus 0 seconds"
+
+	ExpiresByType application/javascript                "access plus 1 year"
+	ExpiresByType application/x-javascript              "access plus 1 year"
+	ExpiresByType text/javascript                       "access plus 1 year"
+
+	ExpiresByType application/manifest+json             "access plus 1 week"
+	ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
+	ExpiresByType text/cache-manifest                   "access plus 0 seconds"
+
+	ExpiresByType audio/ogg                             "access plus 1 month"
+	ExpiresByType image/bmp                             "access plus 1 month"
+	ExpiresByType image/gif                             "access plus 1 month"
+	ExpiresByType image/jpeg                            "access plus 1 month"
+	ExpiresByType image/png                             "access plus 1 month"
+	ExpiresByType image/svg+xml                         "access plus 1 month"
+	ExpiresByType image/webp                            "access plus 1 month"
+	ExpiresByType video/mp4                             "access plus 1 month"
+	ExpiresByType video/ogg                             "access plus 1 month"
+	ExpiresByType video/webm                            "access plus 1 month"
+
+	ExpiresByType application/atom+xml                  "access plus 1 hour"
+	ExpiresByType application/rdf+xml                   "access plus 1 hour"
+	ExpiresByType application/rss+xml                   "access plus 1 hour"
+
+	ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
+	ExpiresByType font/eot                              "access plus 1 month"
+	ExpiresByType font/opentype                         "access plus 1 month"
+	ExpiresByType application/x-font-ttf                "access plus 1 month"
+	ExpiresByType application/font-woff                 "access plus 1 month"
+	ExpiresByType application/x-font-woff               "access plus 1 month"
+	ExpiresByType font/woff                             "access plus 1 month"
+	ExpiresByType application/font-woff2                "access plus 1 month"
+
+	ExpiresByType text/x-cross-domain-policy            "access plus 1 week"
+
+</IfModule>
 
 ### End: Browser caching of ressource files ###
 
 
-### Begin: Settings for mod_rewrite ###
+### Begin: MIME types ###
+
+# Proper MIME types for all files
+<IfModule mod_mime.c>
+
+	# Data interchange
+	AddType application/atom+xml                        atom
+	AddType application/json                            json map topojson
+	AddType application/ld+json                         jsonld
+	AddType application/rss+xml                         rss
+	AddType application/vnd.geo+json                    geojson
+	AddType application/xml                             rdf xml
+
+	# JavaScript
+	AddType application/javascript                      js
+
+	# Manifest files
+	AddType application/manifest+json                   webmanifest
+	AddType application/x-web-app-manifest+json         webapp
+	AddType text/cache-manifest                         appcache
+
+	# Media files
+
+	AddType audio/mp4                                   f4a f4b m4a
+	AddType audio/ogg                                   oga ogg opus
+	AddType image/bmp                                   bmp
+	AddType image/svg+xml                               svg svgz
+	AddType image/webp                                  webp
+	AddType video/mp4                                   f4v f4p m4v mp4
+	AddType video/ogg                                   ogv
+	AddType video/webm                                  webm
+	AddType video/x-flv                                 flv
+	AddType image/x-icon                                cur ico
+
+	# Web fonts
+	AddType application/font-woff                       woff
+	AddType application/font-woff2                      woff2
+	AddType application/vnd.ms-fontobject               eot
+	AddType application/x-font-ttf                      ttc ttf
+	AddType font/opentype                               otf
+
+	# Other
+	AddType application/octet-stream                    safariextz
+	AddType application/x-bb-appworld                   bbaw
+	AddType application/x-chrome-extension              crx
+	AddType application/x-opera-extension               oex
+	AddType application/x-xpinstall                     xpi
+	AddType text/vcard                                  vcard vcf
+	AddType text/vnd.rim.location.xloc                  xloc
+	AddType text/vtt                                    vtt
+	AddType text/x-component                            htc
+
+</IfModule>
+
+# UTF-8 encoding
+AddDefaultCharset utf-8
+<IfModule mod_mime.c>
+	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml
+</IfModule>
+
+### End: MIME types ###
 
-# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).
 
-<IfModule mod_rewrite.c>
 
-# Enable URL rewriting
-RewriteEngine On
-
-# Change this path, if your TYPO3 installation is located in a subdirectory of the website root.
-#RewriteBase /
-
-# Rules to set ApplicationContext based on hostname
-#RewriteCond %{HTTP_HOST} ^dev\.example\.com$
-#RewriteRule .? - [E=TYPO3_CONTEXT:Development]
-#RewriteCond %{HTTP_HOST} ^staging\.example\.com$
-#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
-#RewriteCond %{HTTP_HOST} ^www\.example\.com$
-#RewriteRule .? - [E=TYPO3_CONTEXT:Production]
-
-# Rule for versioned static files, configured through:
-# - $TYPO3_CONF_VARS['BE']['versionNumberInFilename']
-# - $TYPO3_CONF_VARS['FE']['versionNumberInFilename']
-# IMPORTANT: This rule has to be the very first RewriteCond in order to work!
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteCond %{REQUEST_FILENAME} !-d
-RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ $1.$3 [L]
-
-# Basic security checks
-# - Restrict access to deleted files in Recycler directories
-# - Restrict access to TypoScript files in default templates directories
-# - Restrict access to Private extension directories
-# For httpd.conf, use these lines instead of the next ones:
-# RewriteRule ^/TYPO3root/fileadmin/(.*/)?_recycler_/ - [F]
-# RewriteRule ^/TYPO3root/fileadmin/templates/.*(\.txt|\.ts)$ - [F]
-# RewriteRule ^/TYPO3root/typo3conf/ext/[^/]+/Configuration/ - [F]
-# RewriteRule ^/TYPO3root/typo3conf/ext/[^/]+/Resources/Private/ - [F]
-RewriteRule ^fileadmin/(.*/)?_recycler_/ - [F]
-RewriteRule ^fileadmin/templates/.*(\.txt|\.ts)$ - [F]
-RewriteRule ^typo3conf/ext/[^/]+/Configuration/ - [F]
-RewriteRule ^typo3conf/ext/[^/]+/Resources/Private/ - [F]
-
-# Stop rewrite processing, if we are in the typo3/ directory.
-# For httpd.conf, use this line instead of the next one:
-# RewriteRule ^/TYPO3root/(typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]
-RewriteRule ^(typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]
-
-# If the file/symlink/directory does not exist => Redirect to index.php.
-# For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteCond %{REQUEST_FILENAME} !-d
-RewriteCond %{REQUEST_FILENAME} !-l
-
-# Main URL rewriting.
-# For httpd.conf, use this line instead of the next one:
-# RewriteRule .* /TYPO3root/index.php [L]
-RewriteRule .* index.php [L]
+### Begin: Cross Origin ###
 
+# Send the CORS header for images when browsers request it.
+<IfModule mod_setenvif.c>
+	<IfModule mod_headers.c>
+		<FilesMatch "\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
+			SetEnvIf Origin ":" IS_CORS
+			Header set Access-Control-Allow-Origin "*" env=IS_CORS
+		</FilesMatch>
+	</IfModule>
 </IfModule>
 
-### End: Settings for mod_rewrite ###
+# Allow cross-origin access to web fonts.
+<IfModule mod_headers.c>
+	<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
+		Header set Access-Control-Allow-Origin "*"
+	</FilesMatch>
+</IfModule>
+
+### End: Cross Origin ###
 
 
-### Begin: PHP optimisation ###
 
-# If you do not change the following settings, the default values will be used.
+### Begin: Rewriting and Access ###
 
-# TYPO3 works fine with register_globals turned off.
-# This is highly recommended, if your web server has it turned on.
-#php_flag register_globals off
+# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).
 
-### End: PHP optimisation ###
+<IfModule mod_rewrite.c>
+
+	# Enable URL rewriting
+	RewriteEngine On
+
+	# Using mod_rewrite in .htaccess files without knowing the RewriteBase
+	RewriteBase /
+
+	# Store the current location in an environment variable CWD
+	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$
+	RewriteRule ^.*$ - [E=CWD:%2]
+
+	# Rules to set ApplicationContext based on hostname
+	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$
+	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]
+	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$
+	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
+	#RewriteCond %{HTTP_HOST} ^www\.example\.com$
+	RewriteRule .? - [E=TYPO3_CONTEXT:Production]
+
+	# Rule for versioned static files, configured through:
+	# - $GLOBALS['TYPO3_CONF_VARS']['BE']['versionNumberInFilename']
+	# - $GLOBALS['TYPO3_CONF_VARS']['FE']['versionNumberInFilename']
+	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!
+	RewriteCond %{REQUEST_FILENAME} !-f
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ $1.$3 [L]
+
+	# Access block for folders
+	RewriteRule _(?:recycler|temp)_/ - [F]
+	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]
+	RewriteRule typo3temp/logs/ - [F]
+	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext|typo3/vendor)/[^/]+/(?:Configuration|Resources/Private|Tests?)/ - [F]
+
+	# Access block for files or folders starting with a dot
+	RewriteCond %{SCRIPT_FILENAME} -d [OR]
+	RewriteCond %{SCRIPT_FILENAME} -f
+	RewriteRule (?:^|/)\. - [F]
+
+	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory
+	# NOTE: Add your additional local storages here
+	RewriteRule (?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]
+
+	# If the file/symlink/directory does not exist => Redirect to index.php.
+	# For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'.
+	RewriteCond %{REQUEST_FILENAME} !-f
+	RewriteCond %{REQUEST_FILENAME} !-d
+	RewriteCond %{REQUEST_FILENAME} !-l
+	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]
+
+</IfModule>
+
+# Access block for files
+<FilesMatch "(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$">
+	# Apache < 2.3
+	<IfModule !mod_authz_core.c>
+		Order allow,deny
+		Deny from all
+		Satisfy All
+	</IfModule>
+
+	# Apache ≥ 2.3
+	<IfModule mod_authz_core.c>
+		Require all denied
+	</IfModule>
+</FilesMatch>
+
+### End: Rewriting and Access ###
 
 
 
 ### Begin: Miscellaneous ###
 
+# 404 error prevention for non-existing redirected folders
+Options -MultiViews
+
 # Make sure that directory listings are disabled.
-#Options -Indexes
+<IfModule mod_autoindex.c>
+	Options -Indexes
+</IfModule>
+
+<IfModule mod_headers.c>
+	# Force IE to render pages in the highest available mode
+	Header set X-UA-Compatible "IE=edge"
+	<FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$">
+		Header unset X-UA-Compatible
+	</FilesMatch>
+
+	# Reducing MIME type security risks
+	Header set X-Content-Type-Options "nosniff"
+</IfModule>
+
+# ETag removal
+<IfModule mod_headers.c>
+	Header unset ETag
+</IfModule>
+FileETag None
 
 ### End: Miscellaneous ###
 
 
 # Add your own rules here.
-# ...
diff --git a/typo3/sysext/about/Resources/Private/.htaccess b/typo3/sysext/about/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/about/Resources/Private/.htaccess
+++ b/typo3/sysext/about/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/aboutmodules/Resources/Private/.htaccess b/typo3/sysext/aboutmodules/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/aboutmodules/Resources/Private/.htaccess
+++ b/typo3/sysext/aboutmodules/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/belog/Resources/Private/.htaccess b/typo3/sysext/belog/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/belog/Resources/Private/.htaccess
+++ b/typo3/sysext/belog/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/beuser/Resources/Private/.htaccess b/typo3/sysext/beuser/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/beuser/Resources/Private/.htaccess
+++ b/typo3/sysext/beuser/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/core/Classes/Log/Writer/FileWriter.php b/typo3/sysext/core/Classes/Log/Writer/FileWriter.php
index 10ed4690f7d5..18654fc44066 100644
--- a/typo3/sysext/core/Classes/Log/Writer/FileWriter.php
+++ b/typo3/sysext/core/Classes/Log/Writer/FileWriter.php
@@ -202,7 +202,20 @@ class FileWriter extends AbstractWriter {
 	protected function createHtaccessFile($htaccessFile) {
 		// write .htaccess file to protect the log file
 		if (!empty($GLOBALS['TYPO3_CONF_VARS']['SYS']['generateApacheHtaccess']) && !file_exists($htaccessFile)) {
-			GeneralUtility::writeFile($htaccessFile, 'Deny From All');
+			$htaccessContent = '
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
+			';
+			GeneralUtility::writeFile($htaccessFile, $htaccessContent);
 		}
 	}
 
diff --git a/typo3/sysext/core/Documentation/Changelog/.htaccess b/typo3/sysext/core/Documentation/Changelog/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/core/Documentation/Changelog/.htaccess
+++ b/typo3/sysext/core/Documentation/Changelog/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/core/Resources/Private/.htaccess b/typo3/sysext/core/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/core/Resources/Private/.htaccess
+++ b/typo3/sysext/core/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/extensionmanager/Resources/Private/.htaccess b/typo3/sysext/extensionmanager/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/extensionmanager/Resources/Private/.htaccess
+++ b/typo3/sysext/extensionmanager/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/install/Classes/Service/SessionService.php b/typo3/sysext/install/Classes/Service/SessionService.php
index 520512222c51..6a0f64630901 100644
--- a/typo3/sysext/install/Classes/Service/SessionService.php
+++ b/typo3/sysext/install/Classes/Service/SessionService.php
@@ -130,7 +130,20 @@ class SessionService implements \TYPO3\CMS\Core\SingletonInterface {
 					1294587484
 				);
 			}
-			GeneralUtility::writeFile($sessionSavePath . '/.htaccess', 'Order deny, allow' . LF . 'Deny from all');
+			$htaccessContent = '
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
+			';
+			GeneralUtility::writeFile($sessionSavePath . '/.htaccess', $htaccessContent);
 			$indexContent = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">';
 			$indexContent .= '<HTML><HEAD<TITLE></TITLE><META http-equiv=Refresh Content="0; Url=../../">';
 			$indexContent .= '</HEAD></HTML>';
diff --git a/typo3/sysext/install/Resources/Private/.htaccess b/typo3/sysext/install/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/install/Resources/Private/.htaccess
+++ b/typo3/sysext/install/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-temp-htaccess b/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-temp-htaccess
index b26e1235eed9..cab736405857 100644
--- a/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-temp-htaccess
+++ b/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-temp-htaccess
@@ -2,5 +2,14 @@
 # meant to protect temporary files which could contain sensible
 # information. Please do not touch.
 
-Order deny,allow
-Deny from all
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-user_upload-temp-importexport-htaccess b/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-user_upload-temp-importexport-htaccess
index 47310922b8f6..fd77ab3b9f94 100644
--- a/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-user_upload-temp-importexport-htaccess
+++ b/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/fileadmin-user_upload-temp-importexport-htaccess
@@ -2,5 +2,14 @@
 # meant to protect temporary files which could contain sensible
 # information. Please do not touch.
 
-Order deny,allow
-Deny from all
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/lang/Resources/Private/.htaccess b/typo3/sysext/lang/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/lang/Resources/Private/.htaccess
+++ b/typo3/sysext/lang/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
diff --git a/typo3/sysext/taskcenter/Resources/Private/.htaccess b/typo3/sysext/taskcenter/Resources/Private/.htaccess
index 3418e55a6838..9a2aa5a29957 100644
--- a/typo3/sysext/taskcenter/Resources/Private/.htaccess
+++ b/typo3/sysext/taskcenter/Resources/Private/.htaccess
@@ -1 +1,11 @@
-deny from all
\ No newline at end of file
+# Apache < 2.3
+<IfModule !mod_authz_core.c>
+	Order allow,deny
+	Deny from all
+	Satisfy All
+</IfModule>
+
+# Apache ≥ 2.3
+<IfModule mod_authz_core.c>
+	Require all denied
+</IfModule>
-- 
GitLab