diff --git a/CHANGELOG.md b/CHANGELOG.md
index 86914f8a..cc10fefc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,33 @@
+### 4.0.0 (April 14, 2020)
+
+* 🎉 Server-level config! Support httpd configuration at main server level.
+ Add `httpd.conf` file, vhost management, secure HTTP tweaking, etc. See the [README](https://github.com/h5bp/server-configs-apache)
+ [[b50205a...c302596](https://github.com/h5bp/server-configs-apache/compare/df7857d...c302596)]
+* ⚠️ **Breaking**: End of support for Apache httpd version 2.4.9 and below
+ [[baa9cdd](https://github.com/h5bp/server-configs-apache/commit/baa9cdd5567b25d9434b06937a436ceccadb6b4c)]
+* ⚠️ **Breaking**: File paths changes for the `.htaccess` build system
+ [[478ceab](https://github.com/h5bp/server-configs-apache/commit/478ceab3a28786856a1ffcdf6a943ee43907caf0)]
+ [[9cb2763](https://github.com/h5bp/server-configs-apache/commit/9cb2763d7f5e3fce984bfdea903e9df61cdf4bcd)]
+* Rewrite, improve and update a large part of the documentation
+ [[5dc823c](https://github.com/h5bp/server-configs-apache/commit/5dc823c18e4a0ee163c2ee3b772060bce7d782e6)]
+ [[5748d26](https://github.com/h5bp/server-configs-apache/commit/5748d26258394005b4d6dbb2f8474b58ed276e95)]
+ [[d8553ee](https://github.com/h5bp/server-configs-apache/commit/d8553ee58f307419d9ec39ab8c60fc6a6e1135cb)]
+ [[6862ac1](https://github.com/h5bp/server-configs-apache/commit/6862ac17ed60042c4eb47b56c8da055e99ad4dac)]
+ [[ade3659](https://github.com/h5bp/server-configs-apache/commit/ade3659f49b5e23c93695b6888f92bfda3b3f2ed)]
+* Default to HSTS only over secure connections
+ [[5bbc0a1](https://github.com/h5bp/server-configs-apache/commit/5bbc0a1ded8b306ca900338136a50d17eb304b94)]
+* Stricter default for Referrer Policy `strict-origin-when-cross-origin`
+ [[43bcb83](https://github.com/h5bp/server-configs-apache/commit/43bcb833eb0539800e0d3e8a19ad3ef1d6944592)]
+* Add APNG (`.apng`) MIME type
+ [[ad25d31](https://github.com/h5bp/server-configs-apache/commit/ad25d3185fb28971a83e8c721567d7ce08b76f38)]
+* Ensure the presence of security headings where expected
+ [[d656422](https://github.com/h5bp/server-configs-apache/commit/d65642225cf080c15ace94816bed9f15080471b1)]
+ [[43bcb83](https://github.com/h5bp/server-configs-apache/commit/43bcb833eb0539800e0d3e8a19ad3ef1d6944592)]
+ [[d84d94c](https://github.com/h5bp/server-configs-apache/commit/d84d94c7e1e3e647a6ff3b0d29a780481a0638d8)]
+* Make disabling TRACE method usable in a `.htaccess` file
+ [[9ae931c](https://github.com/h5bp/server-configs-apache/commit/9ae931cfe5bc4fe8af0fca21094ad93d4437cfaa)]
+* Improve inline comments.
+
### 3.2.1 (May 8, 2019)
* Fix npm releasing
diff --git a/dist/.htaccess b/dist/.htaccess
index cf054042..96b17a31 100644
--- a/dist/.htaccess
+++ b/dist/.htaccess
@@ -1,4 +1,4 @@
-# Apache Server Configs v3.2.1 | MIT License
+# Apache Server Configs v4.0.0 | MIT License
# https://github.com/h5bp/server-configs-apache
# (!) Using `.htaccess` files slows down Apache, therefore, if you have
@@ -21,6 +21,13 @@
# https://enable-cors.org/
# https://www.w3.org/TR/cors/
+# (!) Do not use this without understanding the consequences.
+# This will permit access from any other website.
+# Instead of using this file, consider using a specific rule such as
+# allowing access based on (sub)domain:
+#
+# Header set Access-Control-Allow-Origin "subdomain.example.com"
+
#
# Header set Access-Control-Allow-Origin "*"
#
@@ -36,7 +43,7 @@
-
+
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
@@ -63,10 +70,9 @@
# Allow cross-origin access to the timing information for all resources.
#
-# If a resource isn't served with a `Timing-Allow-Origin` header that
-# would allow its timing information to be shared with the document,
-# some of the attributes of the `PerformanceResourceTiming` object will
-# be set to zero.
+# If a resource isn't served with a `Timing-Allow-Origin` header that would
+# allow its timing information to be shared with the document, some of the
+# attributes of the `PerformanceResourceTiming` object will be set to zero.
#
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Timing-Allow-Origin
# https://www.w3.org/TR/resource-timing/
@@ -96,8 +102,8 @@
# 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.
+# 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
@@ -117,16 +123,16 @@ Options -MultiViews
# https://hsivonen.fi/doctype/#ie8
#
# (!) Starting with Internet Explorer 11, document modes are deprecated.
-# If your business still relies on older web apps and services that were
-# designed for older versions of Internet Explorer, you might want to
-# consider enabling `Enterprise Mode` throughout your company.
+# If your business still relies on older web apps and services that were
+# designed for older versions of Internet Explorer, you might want to
+# consider enabling `Enterprise Mode` throughout your company.
#
# https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode
# https://blogs.msdn.microsoft.com/ie/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11/
# https://msdn.microsoft.com/en-us/library/ff955275.aspx
- Header set X-UA-Compatible "IE=edge" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
+ Header always set X-UA-Compatible "IE=edge" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
# ######################################################################
@@ -182,8 +188,8 @@ Options -MultiViews
AddType video/webm webm
AddType video/x-flv flv
- # Serving `.ico` image files with a different media type
- # prevents Internet Explorer from displaying them as images:
+ # 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
@@ -224,8 +230,8 @@ Options -MultiViews
# | Character encodings |
# ----------------------------------------------------------------------
-# Serve all resources labeled as `text/html` or `text/plain`
-# with the media type `charset` parameter set to `UTF-8`.
+# 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
@@ -233,8 +239,8 @@ AddDefaultCharset utf-8
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# Serve the following file types with the media type `charset`
-# parameter set to `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
@@ -267,8 +273,8 @@ AddDefaultCharset utf-8
# | Rewrite engine |
# ----------------------------------------------------------------------
-# (1) Turn on the rewrite engine (this is necessary in order for
-# the `RewriteRule` directives to work).
+# (1) Turn on the rewrite engine (this is necessary in order for the
+# `RewriteRule` directives to work).
#
# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine
#
@@ -276,10 +282,10 @@ AddDefaultCharset utf-8
#
# https://httpd.apache.org/docs/current/mod/core.html#options
#
-# (3) If your web host doesn't allow the `FollowSymlinks` option,
-# you need to comment it out or remove it, and then uncomment
-# the `Options +SymLinksIfOwnerMatch` line (4), but be aware
-# of the performance impact.
+# (3) If your web host doesn't allow the `FollowSymlinks` option, you need to
+# comment it out or remove it, and then uncomment the
+# `Options +SymLinksIfOwnerMatch` line (4), but be aware of the performance
+# impact.
#
# https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks
#
@@ -288,14 +294,10 @@ AddDefaultCharset utf-8
# https://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site
# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
#
-# (5) Depending on how your server is set up, you may also need to
-# use the `RewriteOptions` directive to enable some options for
-# the rewrite engine.
+# (5) Depending on how your server is set up, you may also need to use the
+# `RewriteOptions` directive to enable some options for the rewrite engine.
#
# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions
-#
-# (6) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the
-# appropriate schema automatically (http or https).
@@ -314,12 +316,6 @@ AddDefaultCharset utf-8
# (5)
# RewriteOptions
- # (6)
- RewriteCond %{HTTPS} =on
- RewriteRule ^ - [env=proto:https]
- RewriteCond %{HTTPS} !=on
- RewriteRule ^ - [env=proto:http]
-
# ----------------------------------------------------------------------
@@ -330,10 +326,9 @@ AddDefaultCharset utf-8
#
# https://wiki.apache.org/httpd/RewriteHTTPToHTTPS
-# (1) If you're using cPanel AutoSSL or the Let's Encrypt webroot
-# method it will fail to validate the certificate if validation
-# requests are redirected to HTTPS. Turn on the condition(s)
-# you need.
+# (1) If you're using cPanel AutoSSL or the Let's Encrypt webroot method it
+# will fail to validate the certificate if validation requests are
+# redirected to HTTPS. Turn on the condition(s) you need.
#
# https://www.iana.org/assignments/well-known-uris/well-known-uris.xhtml
# https://tools.ietf.org/html/draft-ietf-acme-acme-12
@@ -354,27 +349,39 @@ AddDefaultCharset utf-8
# Rewrite www.example.com → example.com
-# The same content should never be available under two different
-# URLs, especially not with and without `www.` at the beginning.
-# This can cause SEO problems (duplicate content), and therefore,
-# you should choose one of the alternatives and redirect the other
-# one.
+# The same content should never be available under two different URLs,
+# especially not with and without `www.` at the beginning.
+# This can cause SEO problems (duplicate content), and therefore, you should
+# choose one of the alternatives and redirect the other one.
#
# (!) NEVER USE BOTH WWW-RELATED RULES AT THE SAME TIME!
-# (1) The rule assumes by default that both HTTP and HTTPS
-# environments are available for redirection.
-# If your SSL certificate could not handle one of the domains
-# used during redirection, you should turn the condition on.
+# (1) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the
+# appropriate schema automatically (http or https).
+#
+# (2) The rule assumes by default that both HTTP and HTTPS environments are
+# available for redirection.
+# If your SSL certificate could not handle one of the domains used during
+# redirection, you should turn the condition on.
#
# https://github.com/h5bp/server-configs-apache/issues/52
+
RewriteEngine On
+
# (1)
+ RewriteCond %{HTTPS} =on
+ RewriteRule ^ - [E=PROTO:https]
+ RewriteCond %{HTTPS} !=on
+ RewriteRule ^ - [E=PROTO:http]
+
+ # (2)
# RewriteCond %{HTTPS} !=on
+
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
+
# ----------------------------------------------------------------------
@@ -383,18 +390,20 @@ AddDefaultCharset utf-8
# Rewrite example.com → www.example.com
-# The same content should never be available under two different
-# URLs, especially not with and without `www.` at the beginning.
-# This can cause SEO problems (duplicate content), and therefore,
-# you should choose one of the alternatives and redirect the other
-# one.
+# The same content should never be available under two different URLs,
+# especially not with and without `www.` at the beginning.
+# This can cause SEO problems (duplicate content), and therefore, you should
+# choose one of the alternatives and redirect the other one.
#
# (!) NEVER USE BOTH WWW-RELATED RULES AT THE SAME TIME!
-# (1) The rule assumes by default that both HTTP and HTTPS
-# environments are available for redirection.
-# If your SSL certificate could not handle one of the domains
-# used during redirection, you should turn the condition on.
+# (1) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the
+# appropriate schema automatically (http or https).
+#
+# (2) The rule assumes by default that both HTTP and HTTPS environments are
+# available for redirection.
+# If your SSL certificate could not handle one of the domains used during
+# redirection, you should turn the condition on.
#
# https://github.com/h5bp/server-configs-apache/issues/52
@@ -402,13 +411,23 @@ AddDefaultCharset utf-8
# subdomains for certain parts of your website.
#
+
# RewriteEngine On
+
# # (1)
+# RewriteCond %{HTTPS} =on
+# RewriteRule ^ - [E=PROTO:https]
+# RewriteCond %{HTTPS} !=on
+# RewriteRule ^ - [E=PROTO:http]
+
+# # (2)
# # RewriteCond %{HTTPS} !=on
+
# RewriteCond %{HTTP_HOST} !^www\. [NC]
# RewriteCond %{SERVER_ADDR} !=127.0.0.1
# RewriteCond %{SERVER_ADDR} !=::1
# RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
+
#
# ######################################################################
@@ -416,33 +435,32 @@ AddDefaultCharset utf-8
# ######################################################################
# ----------------------------------------------------------------------
-# | Clickjacking |
+# | Frame Options |
# ----------------------------------------------------------------------
# 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.
+# 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`.
+# 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).
+# 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.).
+# 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:
+# 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
@@ -451,7 +469,7 @@ AddDefaultCharset utf-8
# https://www.owasp.org/index.php/Clickjacking
#
-# Header set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
+# Header always set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
#
# ----------------------------------------------------------------------
@@ -461,54 +479,60 @@ AddDefaultCharset utf-8
# 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.
+# 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.
+# There is no policy that fits all websites, you will have to modify the
+# `Content-Security-Policy` directives in the example 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
+# (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.
+# This restriction also means that you must explicitly define from which
+# site(s) your website is allowed to load resources from.
#
-# (2) The `` element is not allowed on the website. This is to
-# prevent attackers from changing the locations of resources loaded
-# from relative URLs.
+# (2) The `` 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 `` element, then `base-uri 'self'`
-# can be used instead.
+# If you want to use the `` element, then `base-uri 'self'` can be
+# used instead.
#
-# (3) Form submissions are only allowed from the current website by
-# setting: `form-action 'self'`.
+# (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 `