Skip to content

Instantly share code, notes, and snippets.

@anthonyshort
Created August 18, 2010 08:18
Show Gist options
  • Save anthonyshort/533971 to your computer and use it in GitHub Desktop.
Save anthonyshort/533971 to your computer and use it in GitHub Desktop.
RewriteEngine on
DirectorySlash off
DirectoryIndex index.html index.cgi
# do not mess with the subdomains
# (I’ve named them with folders starting with “_”)
RewriteRule ^_ - [L]
# this ‘feature’ drove me absolutely insane!
# without this, Apache will give a 404 for a rewrite if a folder of the same name does not exist (e.g. “/blog/hello”)
# <webmasterworld.com/apache/3808792.htm>
Options -MultiViews +Indexes
# allow you guys to see this file
<Files .htaccess>
allow from all
</Files>
# force the latest IE version and use ChromeFrame if it's installed
# (from <github.com/paulirish/html5-boilerplate/blob/master/.htaccess>)
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
</IfModule>
</IfModule>
# no www. also, I don’t know why, but there seems to be incoming links using wap.*, m.* &c. for no reason.
RewriteCond %{HTTP_HOST} ^(?:www|wap|m|mobile|forum|macmini|fake)\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
# error messages:
ErrorDocument 404 /404
# additional filetypes
# --------------------------------------------------------------------------------------------------------------------------
# HTML5 video / audio:
AddType video/ogg .ogv
AddType audio/ogg .oga
AddType video/mp4 .mp4
AddType text/html .html5 # .html5 files are gzipped HTML documents ready to serve
AddType text/css .csz # gzip’d CSS file
AddType font/ttf .ttf .ttz # `@font-face` font embedding. I’ve gzip’d fonts into a “ttz” filetype too
AddType image/svg+xml .svg .svz # SVG file (used for SVG fonts), “svz” gzip’d SVG file
AddType application/rss+xml .rsz # gzip’d RSS file
AddType text/xml .xmz # gzip’d XML sitemap
# compressed cache
AddEncoding gzip .html5 .csz .ttz .svz .rsz .xmz
# force utf-8 for a number of file formats:
AddDefaultCharset utf-8
AddCharset utf-8 .rem .html5 .css .csz .rsz .js .txt
# caching
# --------------------------------------------------------------------------------------------------------------------------
FileETag MTime Size
<IfModule mod_expires.c>
Header set cache-control: public
ExpiresActive on
ExpiresDefault "access plus 1 month"
ExpiresByType text/html "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>
# to seperate content / code webroot is pure content, and the site’s code / design is all within ‘/.system/’
RewriteRule ^robots.txt$ /.system/robots.txt [NC,L]
RewriteRule ^favicon.ico$ /.system/design/favicon.ico [NC,L]
RewriteRule ^apple-touch-icon.png$ /.system/design/apple-touch-icon.png [L]
RewriteRule ^sitemap.xml$ /.system/sitemap.xmz [L]
# mistakes: I make a lot of them, these are here to correct them. move along, nothing to see here...
# ==========================================================================================================================
# should not have used a period in the folder names for the old verisons of the site
RewriteRule ^code/files/0\.(\d)(.*)$ /code/archive/0_$1$2 [R=301,L]
# for a brief period the RSS was mapped as "/rss/<category>" instead of "/<category>/rss" and this change has plagued me
# since. despite sending 301 (permenant redirection), some readers don't update themselves accordingly
RewriteRule ^rss/([a-z0-9-]+)?$ /$1/rss [R=301,L]
# chose a bad name for the remarkable folder that didn’t match the case of the article
RewriteRule ^code/(?:files/)?ReMarkable/(.*)$ /code/remarkable/$1 [R=301,L]
# ==========================================================================================================================
# legacy: corrections for how previous versions of the website worked, you can ignore this...
# ==========================================================================================================================
# ‘/php’ used to be the old code rewrite
RewriteRule ^php$ /.system/ [L,R]
# I changed the ‘tweet’ section to ‘quote’
RewriteRule ^tweet/(.*)$ /quote/$1 [R=301,L]
# links to the HTML used to be ‘.xhtml’ files, now ‘.html5’ because I dropped XML (Firefox 2 support)
RewriteRule ^(.*)\.xhtml$ /$1.html5 [R=301,L]
# support files for articles were held in a folder called 'files', but are now held in a folder with the same name as the
# article. e.g. ‘/code/video_for_everybody’ is the article, and ‘/code/video_for_everybody/’ is the folder with images &c.
RewriteRule ^([-a-z]+)/files/(.*)?$ /$1/$2 [R=301,L]
# don’t have page numbers anymore
RewriteRule ^([a-z0-9-]+/)?\d{1,2}$ /$1 [R=301,L]
# redirect the old source code pages to the archive (v0.1)
RewriteRule ^code/(code|content|database|shared)\.php /code/archive/0_1/$1.php [R=301,L]
# tannerhelland.com used to be hosted here
RewriteRule ^System/RSS/TannerHelland/(News|MusicReleases).xml$ http://www.tannerhelland.com/feed/ [R=301,NC,L]
RewriteRule ^TannerHelland/.*$ http://tannerhelland.com/ [R=301,NC,L]
# theraje.com was temporarily in a subfolder, now in a subdomain
RewriteRule ^(?:theraje.php)$ http://theraje.camendesign.com [R=301,NC,L]
# legacy v0.1 URL redirector
RewriteCond %{QUERY_STRING} .+
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^ /.system/legacy.php [L]
# ==========================================================================================================================
# compressed CSS / RSS
# --------------------------------------------------------------------------------------------------------------------------
# use the compressed CSS if in cache, if not, cache it
RewriteCond %{REQUEST_URI} ^/design/?$
RewriteCond %{DOCUMENT_ROOT}/.cache/design.csz -F
RewriteRule ^design/$ /.cache/design.csz [L]
RewriteRule ^design/$ /.system/article.php?article=.system/design/design.css [L]
RewriteRule ^design/(.*)$ /.system/design/$1 [L]
# give the compressed RSS file for the given directory
# if the file exists in the cache use that, if not, pass to the PHP to generate
RewriteCond %{REQUEST_URI} ^/([a-z0-9-]+/)?rss$
RewriteCond %{DOCUMENT_ROOT}/.cache/%1rss.rsz -F
RewriteRule ^([a-z0-9-]+/)?rss$ /.cache/$1rss.rsz [L]
RewriteRule ^(?:([a-z0-9-]+)/)?rss$ /.system/rss.php?category=$1 [L]
# view-source
# --------------------------------------------------------------------------------------------------------------------------
# you can view the source of all the PHP files on the site due to the distinction that no PHP files are called directly by
# name in the site, instead all PHP is executed via some kind of RewriteRule. therefore we make it that any direct visit to
# a PHP file shows in plain text, but rewrites execute the PHP instead
RewriteCond %{THE_REQUEST} \.(htaccess|php|rem)(\?.*)?\ HTTP
RewriteRule ^.*(?<!view-source\.php)$ /.system/view-source.php?file=$0 [L]
# article content
# --------------------------------------------------------------------------------------------------------------------------
# requesting a tag page (e.g. “/blog/”) - show the latest article
# rewrite to “…/latest”, which will be checked against cache below, and processed accrodingly by article.php
RewriteRule ^([a-z0-9-]+/)?$ /$1latest [PT]
#editing an article?
RewriteRule ^((?:[a-z0-9-]+/)?[a-z0-9_-]+):edit$ /.system/edit.php?article=$1.rem [L]
# requesting an article? (e.g. “/blog/hello”)
# if the file is not in the cache (or we are viewing the HTML), run it through the PHP to generate the article
RewriteCond %{REQUEST_URI} ^(/(?:[a-z0-9-]+/)?[a-z0-9_-]+)(\.html5)?$
RewriteCond %{THE_REQUEST} \b.*?\.html5\b [OR]
RewriteCond %{DOCUMENT_ROOT}/.cache%1.html5 !-F
RewriteRule ^((?:[a-z0-9-]+/)?[a-z0-9_-]+)(\.html5)?$ /.system/article.php?article=$1.rem [L]
# …otherwise load the cache
RewriteRule ^((?:[a-z0-9-]+/)?[a-z0-9_-]+)(\.html5)?$ /.cache/$1.html5 [L]
# directory browsing (under construction)
# --------------------------------------------------------------------------------------------------------------------------
##RewriteRule ^(?:(\.(?!\.)|[-a-z0-9_])+\/)*$ /.system/dir.php?path=$0 [L]
# stop hotlinking
# --------------------------------------------------------------------------------------------------------------------------
# outright block access to the following files
# (too many people getting Video for Everybody wrong and hotlinking my files)
# need to optimise this with env variables or something to reduce repetition
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(fever\..*|([a-z0-9]+\.)?(camendesign|osnews|google|yahoo|bloglines)((\.[a-z]+){1,2})?|.*/fever)/ [NC]
RewriteRule \.(swf|og[agv]|mp4|m4v|ttf|ttz|svg|svz)$ - [F,L]
# don’t get stuck in a loop
RewriteRule ^\.cache/ - [L]
# allowed domains
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(fever\..*|([a-z0-9]+\.)?(camendesign|osnews|google|yahoo|bloglines)((\.[a-z]+){1,2})?|.*/fever)/ [NC]
RewriteCond %{REQUEST_URI} ^.*(?<!_preview)\.(jpe?g|png)$
RewriteCond %{DOCUMENT_ROOT}/.cache%0 -F
RewriteRule ^.*(?<!_preview)\.(jpe?g|png)$ /.cache/$0 [L]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(fever\..*|([a-z0-9]+\.)?(camendesign|osnews|google|yahoo|bloglines)((\.[a-z]+){1,2})?|.*/fever)/ [NC]
RewriteRule ^.*(?<!_preview)\.(jpe?g|png)$ /.system/hotlink.php?image=$0 [L]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment