# This .htaccess file is used to speed up this website
# See https://github.com/sergeychernyshev/.htaccess
# ----------------------------------------------------------------------
# Proper MIME type for all files
#
# Copied from the HTML5 boilerplate project's .htaccess file
# https://github.com/h5bp/html5-boilerplate
# ----------------------------------------------------------------------
# JavaScript
# Normalize to standard type (it's sniffed in IE anyways)
# tools.ietf.org/html/rfc4329#section-7.2
AddType application/javascript js jsonp
AddType application/json json
# Audio
AddType audio/ogg oga ogg
AddType audio/mp4 m4a f4a f4b
# Video
AddType video/ogg ogv
AddType video/mp4 mp4 m4v f4v f4p
AddType video/webm webm
AddType video/x-flv flv
# SVG
# Required for svg webfonts on iPad
# twitter.com/FontSquirrel/status/14855840545
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
# Webfonts
AddType application/vnd.ms-fontobject eot
AddType application/x-font-ttf ttf ttc
AddType font/opentype otf
AddType application/x-font-woff woff
# Assorted types
AddType image/x-icon ico
AddType image/webp webp
AddType text/cache-manifest appcache manifest
AddType text/x-component htc
AddType application/xml rss atom xml rdf
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-xpinstall xpi
AddType application/octet-stream safariextz
AddType application/x-web-app-manifest+json webapp
AddType text/x-vcard vcf
AddType application/x-shockwave-flash swf
AddType text/vtt vtt
# --------------------------------------------------------------------------------------
# Compression: http://code.google.com/speed/page-speed/docs/payload.html#GzipCompression
# --------------------------------------------------------------------------------------
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE application/atom+xml
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/x-component
AddOutputFilterByType DEFLATE text/xml
# The following MIME types are in the process of registration
AddOutputFilterByType DEFLATE application/xslt+xml
AddOutputFilterByType DEFLATE image/svg+xml
# The following MIME types are NOT registered
AddOutputFilterByType DEFLATE application/mathml+xml
AddOutputFilterByType DEFLATE application/rss+xml
# JavaScript has various MIME types
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/ecmascript
AddOutputFilterByType DEFLATE text/javascript
# .ico files and other compressible images
AddOutputFilterByType DEFLATE image/vnd.microsoft.icon
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE image/bmp
AddOutputFilterByType DEFLATE image/tiff
AddOutputFilterByType DEFLATE application/pdf
# compressible fonts (.woff is already compressed)
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
</IfModule>
# ----------------------------------------------------------------------
# Enabling filename rewriting (file.XXX.ext) if URL rewriting is enabled
# Otherwise URLs will use query strings (file.ext?v=XXX)
#
# More proxies cache assets if there is no query string
# ----------------------------------------------------------------------
<IfModule mod_rewrite.c>
RewriteEngine On
# Setting up an environment variable so your code can detect if mod_rewrite rules are executable
# in this folder and you can use file.123.jpg or you need to fall back to file.jpg?123
RewriteRule . - [E=URLVERSIONREWRITE:YES]
# Rewrites a version in file.123.jpg as well as timestamped version file.123_m_12345123512354.jpg
# to original file.jpg so you can use it instead of file.jpg?123 which isn't cached in some proxies.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*).(d+)(_m_d+)?.([^.]+)$ $1.$4 [L,QSA]
# Rewrites a version in file.ac123fe.jpg to original file.jpg
# so you can use it instead of file.jpg?123 which isn't cached in some proxies.
# Used for hash-based URLs where having a timestamp is not necessary.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*).([a-zd]+).([^.]+)$ $1.$3 [L,QSA]
</IfModule>
# -------------------------------------------------------------------------------------------------
# Browser Caching: http://code.google.com/speed/page-speed/docs/caching.html#LeverageBrowserCaching
#
# Google recommends specifying the following for all cacheable resources:
#
# 1. Expires or Cache-Control max-age
#
# Set Expires to a minimum of one month, and preferably up to one year, in the future. (We
# prefer Expires over Cache-Control: max-age because it is is more widely supported.) Do not
# set it to more than one year in the future, as that violates the RFC guidelines.
#
# 2. Last-Modified or ETag
#
# Set the Last-Modified date to the last time the resource was changed. If the Last-Modified
# date is sufficiently far enough in the past, chances are the browser won't refetch it.
#
# Per Google: "it is redundant to specify both Expires and Cache-Control: max-age, or to specify
# both Last-Modified and ETag."
# --------------------------------------------------------------------------------------------------
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType application/json "access plus 1 year"
ExpiresByType application/pdf "access plus 1 year"
ExpiresByType application/x-shockwave-flash "access plus 1 year"
ExpiresByType image/bmp "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/tiff "access plus 1 year"
ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType text/css "access plus 1 year"
ExpiresByType video/x-flv "access plus 1 year"
ExpiresByType application/vnd.bw-fontobject "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
ExpiresByType font/opentype "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
# The following MIME types are in the process of registration
ExpiresByType application/xslt+xml "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
# The following MIME types are NOT registered
ExpiresByType application/mathml+xml "access plus 1 year"
ExpiresByType application/rss+xml "access plus 1 year"
# JavaScript has various MIME types
ExpiresByType application/x-javascript "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/ecmascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
</IfModule>
# TODO: Set Last-Modified per Google's recommendation to complete browser caching
# -------------------------------------------------------------------------
# Disabling ETags as they are most likely misconfigured and
# do not add functionalit beyond Last-Modified
# -------------------------------------------------------------------------
<IfModule mod_headers.c>
# Try removing etag headers (if it's coming from proxy for example)
Header unset ETag
</IfModule>
# Remove ETags
FileETag None