---
---

###############################################################################
# WARNING
###############################################################################
# Only modify this file if you know what you're doing. This file has
# the potential to make pages become PERMANENTLY UNREACHABLE. If in
# doubt, refer to these links:
#
# RewriteRule       - http://httpd.apache.org/docs/current/mod/mod_rewrite.html
# RewriteRule flags - http://httpd.apache.org/docs/current/rewrite/flags.html
# .htaccess tester  - http://htaccess.madewithlove.be/
#
# And remember: three-oh-ONE (301) menas you get ONE chance to get it right;
#               three-oh-TWO (302) means you get TWO chances.
###############################################################################

# set error pages
ErrorDocument 404 {{site.baseurl}}/404.html

# turn off automatic directory indices
Options -Indexes

# turn on redirection
Options +FollowSymLinks
RewriteEngine on

# NOTE:
#      Some of the below redirects are 302s, and some are 301s. 302s are used
#      for redirects whose targets change sometimes. For example:
#          - /docs/          -> /docs/fr/, /docs/en/, etc.
#          - /docs/en/       -> /docs/en/dev/, /docs/en/latest/, etc.
#          - /docs/en/latest -> /docs/en/4.0.0/, /docs/en/5.0.0/, etc.
#
#      301s are for PERMANENT redirects. These are used only for mapping old
#      pages to new pages.
#
# NOTE:
#      (\w\w(?:-\w\w)?)                   - regex for languages
#      (?:\d+\.(?:\d+\.\d+|x))|dev|latest - regex for versions
#
# NOTE:
#      Meanings of some of the flags at the ends of rules:
#
#      L  - terminal rule; if it applies, no more rules are checked
#      R  - redirect (followed by code)
#      NE - no escaping special characters

# 302 (temporary):
#
#     docs/         -> docs/[default language]/latest/
#     docs/*        -> docs/*/latest/
#     docs/*/       -> docs/*/latest/
#     docs/*/latest -> docs/*/latest/
#
RewriteRule ^.*docs/$ {{site.baseurl}}/docs/{{site.language}}/latest/ [R=302,L]
RewriteRule ^.*docs/(\w\w(?:-\w\w)?)$ {{site.baseurl}}/docs/$1/latest/ [R=302,L]
RewriteRule ^.*docs/(\w\w(?:-\w\w)?)/$ {{site.baseurl}}/docs/$1/latest/ [R=302,L]
RewriteRule ^.*docs/(\w\w(?:-\w\w)?)/latest$ {{site.baseurl}}/docs/$1/latest/ [R=302,L]

# 302 (temporary):
#
#     docs/*/XX/* -> docs/*/YY/*
#
{% for redirect in site.data.redirects.version-renames %}RewriteRule ^.*docs/(\w\w(?:-\w\w)?)/{{redirect[0]}}/(.*)$ {{site.baseurl}}/docs/$1/{{redirect[1]}}/$2 [R=302,L]
{% endfor %}

# 302 (temporary):
#
#     docs/XX/* -> docs/YY/*
#
{% for redirect in site.data.redirects.language-renames %}RewriteRule ^.*docs/{{redirect[0]}}/((?:\d+\.(?:\d+\.\d+|x))|dev|latest)/(.*)$ {{site.baseurl}}/docs/{{redirect[1]}}/$1/$2 [R=302,L]
{% endfor %}

# 301 (PERMANENT):
#
#     old docs pages -> new docs pages (global)
#
# NOTE:
#       The first part of the path (i.e. the ".*") is thrown away and replaced
#       by site.baseurl. It is thrown away because there is no RewriteCond to
#       control whether the rewrite happens to a URI or a local file path
#       (when Apache is locating the local file to serve).
{% for redirect in site.data.redirects.docs-global %}RewriteRule ^.*docs/(\w\w(?:-\w\w)?)/((?:\d+\.(?:\d+\.\d+|x))|dev|latest)/{{redirect[0]}}$ {{site.baseurl}}/docs/$1/$2/{{redirect[1]}} [NE,R=301,L]
{% endfor %}

# 301 (PERMANENT):
#
#     old docs pages -> new docs pages (version-specific)
#
{% for redirect in site.data.redirects.docs %}RewriteRule ^.*docs/(\w\w(?:-\w\w)?)/{{redirect[0]}}$ {{site.baseurl}}/docs/$1/{{redirect[1]}} [NE,R=301,L]
{% endfor %}

# 301 (PERMANENT):
#
#     old pages -> new pages
#
{% for redirect in site.data.redirects.general %}RewriteRule ^.*/{{redirect[0]}}$ {{site.baseurl}}/{{redirect[1]}} [NE,R=301,L]
{% endfor %}

# rewrite only:
#
#     /docs/XX/latest/* -> /docs/XX/Y.Y.Y/*
#
# NOTE:
#       This does NOT return a redirect. It returns the resource *as if* the
#       redirected URI was requested. That is, both URIs return the same
#       resource, but the browser won't change the URI (no redirects followed).
#
# NOTE:
#       This needs to be *after* the docs redirects because they might need the
#       "/latest/" to be in the URI in order to activate. Placing this rule
#       before them will rewrite "/latest/" to the latest version and redirects
#       for "/latest/some/path.html" will never activate.
RewriteRule ^.*docs/(\w\w(?:-\w\w)?)/latest/(.*)$ {{site.baseurl}}/docs/$1/{{site.latest_docs_version}}/$2 [L]

# Redirect http to https
# From Cordova PMC Member raphinesse 
# https://s.apache.org/An8s

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

