# Compress static data
AddOutputFilterByType DEFLATE text/html text/plain text/javascript application/javascript text/css text/xml application/xml text/x-js application/x-javascript

# be sure to have those
AddType text/cache-manifest .appcache
AddType application/x-font-ttf .ttf
AddType application/font-woff .woff

# Define pre-compressed files
AddType text/javascript .jsz
AddType text/css .cssz .less
AddType text/xml .xmlz
AddEncoding gzip .jsz .cssz .xmlz
SetEnvIf Request_URI "\.(jsz|cssz|xmlz)$" no-gzip

# excluded PNGs
AddType image/png .xpng
# correct type for ico files
AddType image/x-icon .ico

ExpiresActive On
ExpiresDefault "access plus 6 months"
ExpiresByType image/ico "access plus 6 months"
ExpiresByType image/gif "access plus 6 months"
ExpiresByType image/png "access plus 6 months"
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType image/jpeg "access plus 6 months"
ExpiresByType text/css "access plus 6 months"
ExpiresByType text/html "access plus 6 months"
ExpiresByType text/xml "access plus 6 months"
ExpiresByType text/javascript "access plus 6 months"
ExpiresByType application/x-javascript "access plus 6 months"
ExpiresByType text/cache-manifest "access plus 0 seconds"
ExpiresByType audio/mp3 "access plus 6 months"
ExpiresByType application/font-woff "access plus 6 months"

# cache buster (exclude cache manifests and main pages)
<FilesMatch "^(?!(ui|core|signin)).*$">
    # Modify headers
    Header append Cache-Control "private"
    Header unset Last-Modified
    Header unset Vary
    # Turn off ETag
    Header unset ETag
    FileETag None
</FilesMatch>

# do never ever cache
<FilesMatch "^(online\.js)$">
    ExpiresByType text/javascript "now"
    ExpiresByType application/x-javascript "now"
    ExpiresByType application/javascript "now"
    Header set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
</FilesMatch>

<FilesMatch "^(ui|core|signin)$">
    # must be done this way otherwise firefox does not put these files into application cache
    Header set Content-type "text/html"
    ForceType "text/html"
    ExpiresByType text/html "now"
    # always send 200 due to Safari's 304 bug (affects Desktop and iOS)
    RequestHeader unset If-Modified-Since
    RequestHeader unset If-None-Match
</FilesMatch>

# Avoid click jacking (https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet)
Header always set X-Frame-Options SAMEORIGIN

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} "MSIE [6-8]" [NC]
RewriteRule ^(/?|signin)$ /appsuite/unsupported.html [R=301,L]

RewriteRule v=[^\/]+/(.+) $1 [L]
RewriteRule ^$ ui [L]

# online help fallback
RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteCond %{REQUEST_URI} help(-.+)?/l10n/
RewriteRule ^ %{REQUEST_FILENAME}/index.html [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !help(-.+)?/l10n/en_US
RewriteRule help(-.+)?/l10n/([a-z_A-Z]+)(.+) help$1/l10n/en_US$3 [L]

