This is an automated email from the ASF dual-hosted git repository.
zregvart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-website.git
The following commit(s) were added to refs/heads/master by this push:
new ef771f5 CAMEL-11502: .htaccess improvements
ef771f5 is described below
commit ef771f506c7388cb0d26702b6f8911701838325a
Author: Zoran Regvart <[email protected]>
AuthorDate: Thu Jul 11 14:23:28 2019 +0200
CAMEL-11502: .htaccess improvements
Copies over relevant parts from HTML5 boilerplate and configures as
needed.
---
static/.htaccess | 756 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 756 insertions(+)
diff --git a/static/.htaccess b/static/.htaccess
index 4e3c2d1..ea8001c 100644
--- a/static/.htaccess
+++ b/static/.htaccess
@@ -1,2 +1,758 @@
+# Redirect security advisories to new location
RewriteEngine on
RewriteRule "security-advisories.data/(.+)$" "security/$1" [R=permanent,L]
+
+# Customize what Apache returns to the client in case of an error.
+#
+# https://httpd.apache.org/docs/current/mod/core.html#errordocument
+ErrorDocument 404 /404.html
+
+# Disable the pattern matching based on filenames.
+#
+# This setting prevents Apache from returning a 404 error as the result
+# of a rewrite when the directory with the same name does not exist.
+#
+# https://httpd.apache.org/docs/current/content-negotiation.html#multiviews
+Options -MultiViews
+
+# Serve resources with the proper media types (f.k.a. MIME types).
+#
+# https://www.iana.org/assignments/media-types/media-types.xhtml
+# https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype
+
+<IfModule mod_mime.c>
+
+ # Data interchange
+
+ AddType application/xml xml
+
+
+ # JavaScript
+
+ # Servers should use text/javascript for JavaScript resources.
+ # https://html.spec.whatwg.org/multipage/scripting.html#scriptingLanguages
+
+ AddType text/javascript js
+
+
+ # Media files
+
+ # Serving `.ico` image files with a different media type
+ # prevents Internet Explorer from displaying them as images:
+ #
https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee
+
+ AddType image/x-icon cur ico
+
+
+ # Web fonts
+
+ AddType font/woff woff
+ AddType font/woff2 woff2
+ AddType application/vnd.ms-fontobject eot
+ AddType font/ttf ttf
+ AddType font/collection ttc
+ AddType font/otf otf
+
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | Character encodings |
+# ----------------------------------------------------------------------
+
+# Serve all resources labeled as `text/html` or `text/plain`
+# with the media type `charset` parameter set to `UTF-8`.
+#
+# https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset
+
+AddDefaultCharset utf-8
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+# Serve the following file types with the media type `charset`
+# parameter set to `UTF-8`.
+#
+# https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset
+
+<IfModule mod_mime.c>
+ AddCharset utf-8 .css .js
+</IfModule>
+
+# ######################################################################
+# # SECURITY #
+# ######################################################################
+
+# ----------------------------------------------------------------------
+# | Clickjacking |
+# ----------------------------------------------------------------------
+
+# Protect website against clickjacking.
+#
+# The example below sends the `X-Frame-Options` response header with
+# the value `DENY`, informing browsers not to display the content of
+# the web page in any frame.
+#
+# This might not be the best setting for everyone. You should read
+# about the other two possible values the `X-Frame-Options` header
+# field can have: `SAMEORIGIN` and `ALLOW-FROM`.
+# https://tools.ietf.org/html/rfc7034#section-2.1.
+#
+# Keep in mind that while you could send the `X-Frame-Options` header
+# for all of your website’s pages, this has the potential downside that
+# it forbids even non-malicious framing of your content (e.g.: when
+# users visit your website using a Google Image Search results page).
+#
+# Nonetheless, you should ensure that you send the `X-Frame-Options`
+# header for all pages that allow a user to make a state changing
+# operation (e.g: pages that contain one-click purchase links, checkout
+# or bank-transfer confirmation pages, pages that make permanent
+# configuration changes, etc.).
+#
+# Sending the `X-Frame-Options` header can also protect your website
+# against more than just clickjacking attacks:
+# https://cure53.de/xfo-clickjacking.pdf.
+#
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+# https://tools.ietf.org/html/rfc7034
+#
https://blogs.msdn.microsoft.com/ieinternals/2010/03/30/combating-clickjacking-with-x-frame-options/
+# https://www.owasp.org/index.php/Clickjacking
+
+<IfModule mod_headers.c>
+ Header set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | Content Security Policy (CSP) |
+# ----------------------------------------------------------------------
+
+# Mitigate the risk of cross-site scripting and other content-injection
+# attacks.
+#
+# This can be done by setting a `Content Security Policy` which
+# whitelists trusted sources of content for your website.
+#
+# There is no policy that fits all websites, you will have to modify
+# the `Content-Security-Policy` directives in the example below depending
+# on your needs.
+#
+# The example policy below aims to:
+#
+# (1) Restrict all fetches by default to the origin of the current website
+# by setting the `default-src` directive to `'self'` - which acts as a
+# fallback to all "Fetch directives"
(https://developer.mozilla.org/en-US/docs/Glossary/Fetch_directive).
+#
+# This is convenient as you do not have to specify all Fetch directives
+# that apply to your site, for example:
+# `connect-src 'self'; font-src 'self'; script-src 'self'; style-src
'self'`, etc.
+#
+# This restriction also means that you must explicitly define from
+# which site(s) your website is allowed to load resources from.
+#
+# (2) The `<base>` element is not allowed on the website. This is to
+# prevent attackers from changing the locations of resources loaded
+# from relative URLs.
+#
+# If you want to use the `<base>` element, then `base-uri 'self'`
+# can be used instead.
+#
+# (3) Form submissions are only allowed from the current website by
+# setting: `form-action 'self'`.
+#
+# (4) Prevents all websites (including your own) from embedding your
+# webpages within e.g. the `<iframe>` or `<object>` element by
+# setting `frame-ancestors 'none'`.
+#
+# The `frame-ancestors` directive helps avoid "Clickjacking" attacks
+# and is similar to the `X-Frame-Options` header.
+#
+# Browsers that support the CSP header will ignore `X-Frame-Options`
+# if `frame-ancestors` is also specified.
+#
+# (5) Forces the browser to treat all the resources that are served over
+# HTTP as if they were loaded securely over HTTPS by setting the
+# `upgrade-insecure-requests` directive.
+#
+# Please note that `upgrade-insecure-requests` does not ensure
+# HTTPS for the top-level navigation. If you want to force the
+# website itself to be loaded over HTTPS you must include the
+# `Strict-Transport-Security` header.
+#
+# To make your CSP implementation easier, you can use an online CSP header
+# generator such as:
+# https://report-uri.com/home/generate/
+#
+# It is encouraged that you validate your CSP header using a CSP validator
+# such as:
+# https://csp-evaluator.withgoogle.com
+#
+# https://csp.withgoogle.com/docs/
+#
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
+# https://www.html5rocks.com/en/tutorials/security/content-security-policy/
+# https://www.w3.org/TR/CSP/
+
+<IfModule mod_headers.c>
+ # (1) (2)
(3) (4) (5)
+ Header set Content-Security-Policy "default-src 'self'; base-uri 'none';
form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests"
"expr=%{CONTENT_TYPE} =~ m#text/html#i"
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | File access |
+# ----------------------------------------------------------------------
+
+# Block access to directories without a default document.
+#
+# You should leave the following uncommented, as you shouldn't allow
+# anyone to surf through every directory on your server (which may
+# includes rather private places such as the CMS's directories).
+
+<IfModule mod_autoindex.c>
+ Options -Indexes
+</IfModule>
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+# Block access to all hidden files and directories with the exception of
+# the visible content from within the `/.well-known/` hidden directory.
+#
+# These types of files usually contain user preferences or the preserved
+# state of an utility, and can include rather private places like, for
+# example, the `.git` or `.svn` directories.
+#
+# The `/.well-known/` directory represents the standard (RFC 5785) path
+# prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`,
+# `/.well-known/keybase.txt`), and therefore, access to its visible
+# content should not be blocked.
+#
+# https://www.mnot.net/blog/2010/04/07/well-known
+# https://tools.ietf.org/html/rfc5785
+
+<IfModule mod_rewrite.c>
+ RewriteEngine On
+ RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
+ RewriteCond %{SCRIPT_FILENAME} -d [OR]
+ RewriteCond %{SCRIPT_FILENAME} -f
+ RewriteRule "(^|/)\." - [F]
+</IfModule>
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+# Block access to files that can expose sensitive information.
+#
+# By default, block access to backup and source files that may be
+# left by some text editors and can pose a security risk when anyone
+# has access to them.
+#
+# https://feross.org/cmsploit/
+#
+# (!) Update the `<FilesMatch>` regular expression from below to
+# include any files that might end up on your production server and
+# can expose sensitive information about your website. These files may
+# include: configuration files, files that contain metadata about the
+# project (e.g.: project dependencies), build scripts, etc..
+
+<IfModule mod_authz_core.c>
+ <FilesMatch
"(^#.*#|\.(bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$">
+ Require all denied
+ </FilesMatch>
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | HTTP Strict Transport Security (HSTS) |
+# ----------------------------------------------------------------------
+
+# Force client-side SSL redirection.
+#
+# If a user types `example.com` in their browser, even if the server
+# redirects them to the secure version of the website, that still leaves
+# a window of opportunity (the initial HTTP connection) for an attacker
+# to downgrade or redirect the request.
+#
+# The following header ensures that browser will ONLY connect to your
+# server via HTTPS, regardless of what the users type in the browser's
+# address bar.
+#
+# (!) Be aware that this, once published, is not revokable and you must ensure
+# being able to serve the site via SSL for the duration you've specified
+# in max-age. When you don't have a valid SSL connection (anymore) your
+# visitors will see a nasty error message even when attempting to connect
+# via simple HTTP.
+#
+# (!) Remove the `includeSubDomains` optional directive if the website's
+# subdomains are not using HTTPS.
+#
+# (1) If you want to submit your site for HSTS preload (2) you must
+# * ensure the `includeSubDomains` directive to be present
+# * the `preload` directive to be specified
+# * the `max-age` to be at least 31536000 seconds (1 year) according to
the current status.
+#
+# It is also advised (3) to only serve the HSTS header via a secure
connection
+# which can be done with either `env=https` or `"expr=%{HTTPS} == 'on'"`
(4). The
+# exact way depends on your environment and might just be tried.
+#
+# (2) https://hstspreload.org/
+# (3) https://tools.ietf.org/html/rfc6797#section-7.2
+# (4)
https://stackoverflow.com/questions/24144552/how-to-set-hsts-header-from-htaccess-only-on-https/24145033#comment81632711_24145033
+#
+#
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
+# https://tools.ietf.org/html/rfc6797#section-6.1
+# https://www.html5rocks.com/en/tutorials/security/transport-layer-security/
+#
https://blogs.msdn.microsoft.com/ieinternals/2014/08/18/strict-transport-security/
+
+<IfModule mod_headers.c>
+ Header always set Strict-Transport-Security "max-age=16070400;
includeSubDomains"
+ # (1) or if HSTS preloading is desired (respect (2) for current
requirements):
+ # Header always set Strict-Transport-Security "max-age=31536000;
includeSubDomains; preload" env=HTTPS
+ # (4) respectively… (respect (2) for current requirements):
+ # Header always set Strict-Transport-Security "max-age=31536000;
includeSubDomains; preload" "expr=%{HTTPS} == 'on'"
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | Reducing MIME type security risks |
+# ----------------------------------------------------------------------
+
+# Prevent some browsers from MIME-sniffing the response.
+#
+# This reduces exposure to drive-by download attacks and cross-origin
+# data leaks, and should be left uncommented, especially if the server
+# is serving user-uploaded content or content that could potentially be
+# treated as executable by the browser.
+#
+#
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
+#
https://blogs.msdn.microsoft.com/ie/2008/07/02/ie8-security-part-v-comprehensive-protection/
+# https://mimesniff.spec.whatwg.org/
+
+<IfModule mod_headers.c>
+ Header set X-Content-Type-Options "nosniff"
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | Reflected Cross-Site Scripting (XSS) attacks |
+# ----------------------------------------------------------------------
+
+# (1) Try to re-enable the cross-site scripting (XSS) filter built
+# into most web browsers.
+#
+# The filter is usually enabled by default, but in some cases it
+# may be disabled by the user. However, in Internet Explorer for
+# example, it can be re-enabled just by sending the
+# `X-XSS-Protection` header with the value of `1`.
+#
+# (2) Prevent web browsers from rendering the web page if a potential
+# reflected (a.k.a non-persistent) XSS attack is detected by the
+# filter.
+#
+# By default, if the filter is enabled and browsers detect a
+# reflected XSS attack, they will attempt to block the attack
+# by making the smallest possible modifications to the returned
+# web page.
+#
+# Unfortunately, in some browsers (e.g.: Internet Explorer),
+# this default behavior may allow the XSS filter to be exploited,
+# thereby, it's better to inform browsers to prevent the rendering
+# of the page altogether, instead of attempting to modify it.
+#
+#
https://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities
+#
+# (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that
+# you are taking all possible measures to prevent XSS attacks, the
+# most obvious being: validating and sanitizing your website's inputs.
+#
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
+#
https://blogs.msdn.microsoft.com/ie/2008/07/02/ie8-security-part-iv-the-xss-filter/
+#
https://blogs.msdn.microsoft.com/ieinternals/2011/01/31/controlling-the-xss-filter/
+# https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
+
+<IfModule mod_headers.c>
+ # (1) (2)
+ Header set X-XSS-Protection "1; mode=block" "expr=%{CONTENT_TYPE} =~
m#text/html#i"
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | Referrer Policy |
+# ----------------------------------------------------------------------
+
+# A web application uses HTTPS and a URL-based session identifier.
+# The web application might wish to link to HTTPS resources on other
+# web sites without leaking the user's session identifier in the URL.
+#
+# This can be done by setting a `Referrer Policy` which
+# whitelists trusted sources of content for your website.
+#
+# To check your referrer policy, you can use an online service
+# such as: https://securityheaders.io/.
+#
+# https://scotthelme.co.uk/a-new-security-header-referrer-policy/
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
+
+<IfModule mod_headers.c>
+ # no-referrer-when-downgrade (default)
+ # This should be the user agent's default behavior if no policy is
+ # specified.The origin is sent as referrer to a-priori as-much-secure
+ # destination (HTTPS->HTTPS), but isn't sent to a less secure destination
+ # (HTTPS->HTTP).
+ Header set Referrer-Policy "no-referrer-when-downgrade"
"expr=%{CONTENT_TYPE} =~ m#text/html#i"
+</IfModule>
+
+# ######################################################################
+# # WEB PERFORMANCE #
+# ######################################################################
+
+# ----------------------------------------------------------------------
+# | Compression |
+# ----------------------------------------------------------------------
+
+<IfModule mod_deflate.c>
+
+ # Force compression for mangled `Accept-Encoding` request headers
+ #
+ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
+ # https://calendar.perfplanet.com/2010/pushing-beyond-gzipping/
+
+ <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.
+ #
+ #
https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype
+
+ <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/geo+json" \
+ "application/vnd.ms-fontobject" \
+ "application/wasm" \
+ "application/x-font-ttf" \
+ "application/x-javascript" \
+ "application/x-web-app-manifest+json" \
+ "application/xhtml+xml" \
+ "application/xml" \
+ "font/eot" \
+ "font/opentype" \
+ "font/otf" \
+ "image/bmp" \
+ "image/svg+xml" \
+ "image/vnd.microsoft.icon" \
+ "text/cache-manifest" \
+ "text/calendar" \
+ "text/css" \
+ "text/html" \
+ "text/javascript" \
+ "text/plain" \
+ "text/markdown" \
+ "text/vcard" \
+ "text/vnd.rim.location.xloc" \
+ "text/vtt" \
+ "text/x-component" \
+ "text/x-cross-domain-policy" \
+ "text/xml"
+
+ </IfModule>
+
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ # Map the following filename extensions to the specified
+ # encoding type in order to make Apache serve the file types
+ # with the appropriate `Content-Encoding` response header
+ # (do note that this will NOT make Apache compress them!).
+ #
+ # If these files types would be served without an appropriate
+ # `Content-Enable` response header, client applications (e.g.:
+ # browsers) wouldn't know that they first need to uncompress
+ # the response, and thus, wouldn't be able to understand the
+ # content.
+ #
+ #
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
+ # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding
+
+ <IfModule mod_mime.c>
+ AddEncoding gzip svgz
+ </IfModule>
+
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | Brotli pre-compressed content |
+# ----------------------------------------------------------------------
+
+# Serve brotli compressed CSS, JS, HTML, SVG, ICS and JSON files
+# if they exist and if the client accepts br encoding.
+#
+# (!) To make this part relevant, you need to generate encoded
+# files by your own. Enabling this part will not auto-generate
+# brotlied files.
+#
+# Note that some clients (eg. browsers) require a secure connection
+# to request brotli-compressed resources.
+# https://www.chromestatus.com/feature/5420797577396224
+#
+# https://httpd.apache.org/docs/current/mod/mod_brotli.html#precompressed
+
+# <IfModule mod_headers.c>
+
+# RewriteCond %{HTTP:Accept-Encoding} br
+# RewriteCond %{REQUEST_FILENAME}\.br -f
+# RewriteRule \.(css|ics|js|json|html|svg)$ %{REQUEST_URI}.br [L]
+
+# # Prevent mod_deflate double gzip
+# RewriteRule \.br$ - [E=no-gzip:1]
+
+# <FilesMatch "\.br$">
+
+# <IfModule mod_mime.c>
+# # Serve correct content types
+# AddType text/css css.br
+# AddType text/calendar ics.br
+# AddType text/javascript js.br
+# AddType application/json json.br
+# AddType text/html html.br
+# AddType image/svg+xml svg.br
+
+# # Serve correct content charset
+# AddCharset utf-8 .css.br \
+# .ics.br \
+# .js.br \
+# .json.br
+# </IfModule>
+
+# # Force proxies to cache brotlied and non-brotlied files separately
+# Header append Vary Accept-Encoding
+
+# </FilesMatch>
+
+# # Serve correct encoding type
+# AddEncoding br .br
+
+# </IfModule>
+
+# ----------------------------------------------------------------------
+# | GZip pre-compressed content |
+# ----------------------------------------------------------------------
+
+# Serve gzip compressed CSS, JS, HTML, SVG, ICS and JSON files
+# if they exist and if the client accepts gzip encoding.
+#
+# (!) To make this part relevant, you need to generate encoded
+# files by your own. Enabling this part will not auto-generate
+# gziped files.
+#
+# https://httpd.apache.org/docs/current/mod/mod_deflate.html#precompressed
+#
+# (1)
+# Removing default MIME Type for .gz files allowing to add custom
+# sub-types.
+# You may prefer using less generic extensions such as .html_gz in
+# order to keep default behavior regarding .gz files.
+# https://httpd.apache.org/docs/current/mod/mod_mime.html#removetype
+
+# <IfModule mod_headers.c>
+
+# RewriteCond %{HTTP:Accept-Encoding} gzip
+# RewriteCond %{REQUEST_FILENAME}\.gz -f
+# RewriteRule \.(css|ics|js|json|html|svg)$ %{REQUEST_URI}.gz [L]
+
+# # Prevent mod_deflate double gzip
+# RewriteRule \.gz$ - [E=no-gzip:1]
+
+# <FilesMatch "\.gz$">
+
+# # Serve correct content types
+# <IfModule mod_mime.c>
+# # (1)
+# RemoveType gz
+
+# # Serve correct content types
+# AddType text/css css.gz
+# AddType text/calendar ics.gz
+# AddType text/javascript js.gz
+# AddType application/json json.gz
+# AddType text/html html.gz
+# AddType image/svg+xml svg.gz
+
+# # Serve correct content charset
+# AddCharset utf-8 .css.gz \
+# .ics.gz \
+# .js.gz \
+# .json.gz
+# </IfModule>
+
+# # Force proxies to cache gzipped and non-gzipped files separately
+# Header append Vary Accept-Encoding
+
+# </FilesMatch>
+
+# # Serve correct encoding type
+# AddEncoding gzip .gz
+
+# </IfModule>
+
+# ----------------------------------------------------------------------
+# | Content transformation |
+# ----------------------------------------------------------------------
+
+# Prevent intermediate caches or proxies (e.g.: such as the ones
+# used by mobile network providers) from modifying the website's
+# content.
+#
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
+# https://tools.ietf.org/html/rfc2616#section-14.9.5
+#
+# (!) If you are using `mod_pagespeed`, please note that setting
+# the `Cache-Control: no-transform` response header will prevent
+# `PageSpeed` from rewriting `HTML` files, and, if the
+# `ModPagespeedDisableRewriteOnNoTransform` directive isn't set
+# to `off`, also from rewriting other resources.
+#
+#
https://developers.google.com/speed/pagespeed/module/configuration#notransform
+
+<IfModule mod_headers.c>
+ Header merge Cache-Control "no-transform"
+</IfModule>
+
+# ----------------------------------------------------------------------
+# | ETags |
+# ----------------------------------------------------------------------
+
+# Remove `ETags` as resources are sent with far-future expires headers.
+#
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
+# https://developer.yahoo.com/performance/rules.html#etags
+# https://tools.ietf.org/html/rfc7232#section-2.3
+
+# `FileETag None` doesn't work in all cases.
+<IfModule mod_headers.c>
+ Header unset ETag
+</IfModule>
+
+FileETag None
+
+# ----------------------------------------------------------------------
+# | Cache expiration |
+# ----------------------------------------------------------------------
+
+# Serve resources with far-future expiration date.
+#
+# (!) If you don't control versioning with filename-based
+# cache busting, you should consider lowering the cache times
+# to something like one week.
+#
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
+# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires
+# https://httpd.apache.org/docs/current/mod/mod_expires.html
+
+<IfModule mod_expires.c>
+
+ ExpiresActive on
+ ExpiresDefault "access plus 1 month"
+
+ # CSS
+
+ ExpiresByType text/css "access plus 1 year"
+
+
+ # Data interchange
+
+ 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/json "access plus 0 seconds"
+ ExpiresByType application/ld+json "access plus 0 seconds"
+ ExpiresByType application/schema+json "access plus 0 seconds"
+ ExpiresByType application/geo+json "access plus 0 seconds"
+ ExpiresByType application/xml "access plus 0 seconds"
+ ExpiresByType text/calendar "access plus 0 seconds"
+ ExpiresByType text/xml "access plus 0 seconds"
+
+
+ # Favicon (cannot be renamed!) and cursor images
+
+ ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
+ ExpiresByType image/x-icon "access plus 1 week"
+
+ # HTML
+
+ ExpiresByType text/html "access plus 0 seconds"
+
+
+ # JavaScript
+
+ ExpiresByType application/javascript "access plus 1 year"
+ ExpiresByType application/x-javascript "access plus 1 year"
+ ExpiresByType text/javascript "access plus 1 year"
+
+
+ # Manifest files
+
+ 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"
+
+
+ # Markdown
+
+ ExpiresByType text/markdown "access plus 0 seconds"
+
+
+ # Media files
+
+ 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"
+
+
+ # WebAssembly
+
+ ExpiresByType application/wasm "access plus 1 year"
+
+
+ # Web fonts
+
+ # Collection
+ ExpiresByType font/collection "access plus 1 month"
+
+ # Embedded OpenType (EOT)
+ ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
+ ExpiresByType font/eot "access plus 1 month"
+
+ # OpenType
+ ExpiresByType font/opentype "access plus 1 month"
+ ExpiresByType font/otf "access plus 1 month"
+
+ # TrueType
+ ExpiresByType application/x-font-ttf "access plus 1 month"
+ ExpiresByType font/ttf "access plus 1 month"
+
+ # Web Open Font Format (WOFF) 1.0
+ ExpiresByType application/font-woff "access plus 1 month"
+ ExpiresByType application/x-font-woff "access plus 1 month"
+ ExpiresByType font/woff "access plus 1 month"
+
+ # Web Open Font Format (WOFF) 2.0
+ ExpiresByType application/font-woff2 "access plus 1 month"
+ ExpiresByType font/woff2 "access plus 1 month"
+
+
+ # Other
+
+ ExpiresByType text/x-cross-domain-policy "access plus 1 week"
+
+</IfModule>
+