Created
August 18, 2010 08:18
-
-
Save anthonyshort/533971 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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