2010-08-23 13:34:35 +00:00
<?xml version="1.0" encoding="utf-8"?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "fr" xml:lang = "fr" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" / >
< meta name = "keywords" content = "blog" >
< link rel = "shortcut icon" type = "image/x-icon" href = "/Scratch/img/favicon.ico" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/assets/css/main.css" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/twilight.css" / >
< link rel = "stylesheet" type = "text/css" href = "/Scratch/css/idc.css" / >
< link rel = "alternate" type = "application/rss+xml" title = "RSS" href = "http://feeds.feedburner.com/yannespositocomen" / >
2010-09-16 11:56:03 +00:00
< link rel = "alternate" lang = "fr" xml:lang = "fr" title = "Maintenant sur Heroku" type = "text/html" hreflang = "fr" href = "/Scratch/fr/blog/2010-08-23-Now-heberged-on-heroku/" / >
< link rel = "alternate" lang = "en" xml:lang = "en" title = "Now hosted by heroku" type = "text/html" hreflang = "en" href = "/Scratch/en/blog/2010-08-23-Now-heberged-on-heroku/" / >
2010-08-23 13:34:35 +00:00
< script type = "text/javascript" src = "/Scratch/js/jquery-1.3.1.min.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/jquery.cookie.js" > < / script >
< script type = "text/javascript" src = "/Scratch/js/index.js" > < / script >
2010-09-16 11:56:03 +00:00
< title > Now hosted by heroku< / title >
2010-08-23 13:34:35 +00:00
< / head >
< body lang = "en" >
< script type = "text/javascript" > / / < ! [ C D A T A [
document.write('< div id = "blackpage" > < img src = "/Scratch/img/loading.gif" alt = "loading..." / > < / div > ');
// ]]>
< / script >
< div id = "content" >
2010-09-27 18:49:15 +00:00
< div id = "choix" >
< div class = "return" > < a href = "#entete" > ↓ Menu ↓ < / a > < / div >
< div id = "choixlang" >
< a href = "/Scratch/fr/blog/2010-08-23-Now-heberged-on-heroku/" onclick = "setLanguage('fr')" > en Français< / a >
< / div >
< / div >
< img src = "/Scratch/img/presentation.png" alt = "Presentation drawing" / >
2010-08-23 13:34:35 +00:00
< div id = "titre" >
< h1 >
2010-09-16 11:56:03 +00:00
Now hosted by heroku
2010-08-23 13:34:35 +00:00
< / h1 >
< h2 >
2010-09-16 11:56:03 +00:00
Host static website on Heroku
2010-08-23 13:34:35 +00:00
< / h2 >
< / div >
< div class = "flush" > < / div >
< div class = "flush" > < / div >
< div id = "afterheader" >
< div class = "corps" >
< h1 class = "first" id = "now-on-herokuhttpherokucom" > Now on < a href = "http://heroku.com" > Heroku< / a > < / h1 >
< p > I now changed my hosting to < a href = "http://heroku.com" > Heroku< / a > .
I believe it will be far more reliable.< / p >
< p > But as you should know my website is completely static.
I use < a href = "http://nanoc.stoneship.org/" > nanoc< / a > to generate it.
But here is the conf to make it work on heroku.< / p >
2010-08-25 10:10:27 +00:00
< p > The root of my files is < code > /output< / code > . You only need to create a < code > config.ru< / code > < sup id = "fnref:1" > < a href = "#fn:1" rel = "footnote" > 1< / a > < / sup > file:< / p >
2010-08-23 13:34:35 +00:00
< div class = "code" > < div class = "file" > < a href = "/Scratch/en/blog/2010-08-23-Now-heberged-on-heroku/code/config.ru" > ➥ config.ru < / a > < / div > < div class = "withfile" >
< pre class = "twilight" >
< span class = "Keyword" > require< / span > < span class = "String" > < span class = "String" > '< / span > rubygems< span class = "String" > '< / span > < / span >
< span class = "Keyword" > require< / span > < span class = "String" > < span class = "String" > '< / span > rack< span class = "String" > '< / span > < / span >
2010-08-25 10:05:23 +00:00
< span class = "Keyword" > require< / span > < span class = "String" > < span class = "String" > '< / span > rack/contrib< span class = "String" > '< / span > < / span >
2010-08-23 13:34:35 +00:00
< span class = "Keyword" > require< / span > < span class = "String" > < span class = "String" > '< / span > rack-rewrite< span class = "String" > '< / span > < / span >
2010-08-25 10:05:23 +00:00
< span class = "Keyword" > require< / span > < span class = "String" > < span class = "String" > '< / span > mime/types< span class = "String" > '< / span > < / span >
use < span class = "Support" > Rack< / span > ::< span class = "Entity" > ETag< / span >
< span class = "Keyword" > module< / span > ::< span class = "Entity" > Rack< / span >
< span class = "Keyword" > class< / span > < span class = "Entity" > TryStatic< span class = "EntityInheritedClass" > < span class = "EntityInheritedClass" > < < / span > Static< / span > < / span >
< span class = "Keyword" > def< / span > < span class = "Entity" > initialize< / span > (< span class = "Variable" > app< span class = "Variable" > ,< / span > options< / span > )
< span class = "Keyword" > super< / span >
< span class = "Variable" > < span class = "Variable" > @< / span > try< / span > < span class = "Keyword" > =< / span > ([< span class = "String" > < span class = "String" > '< / span > < span class = "String" > '< / span > < / span > ] < span class = "Keyword" > +< / span > < span class = "Variable" > Array< / span > (options.< span class = "Entity" > delete< / span > (< span class = "Constant" > < span class = "Constant" > :< / span > try< / span > )) < span class = "Keyword" > +< / span > [< span class = "String" > < span class = "String" > '< / span > < span class = "String" > '< / span > < / span > ])
< span class = "Keyword" > end< / span >
< span class = "Keyword" > def< / span > < span class = "Entity" > call< / span > (< span class = "Variable" > env< / span > )
< span class = "Variable" > < span class = "Variable" > @< / span > next< / span > < span class = "Keyword" > =< / span > < span class = "Constant" > 0< / span >
< span class = "Keyword" > while< / span > < span class = "Variable" > < span class = "Variable" > @< / span > next< / span > < span class = "Keyword" > < < / span > < span class = "Variable" > < span class = "Variable" > @< / span > try< / span > .< span class = "Entity" > size< / span > < span class = "Keyword" > & & < / span > < span class = "Constant" > 404< / span > < span class = "Keyword" > ==< / span > (resp < span class = "Keyword" > =< / span > < span class = "Keyword" > super< / span > (< span class = "Entity" > try_next< / span > (env)))[< span class = "Constant" > 0< / span > ]
< span class = "Variable" > < span class = "Variable" > @< / span > next< / span > < span class = "Keyword" > +=< / span > < span class = "Constant" > 1< / span >
< span class = "Keyword" > end< / span >
< span class = "Constant" > 404< / span > < span class = "Keyword" > ==< / span > resp[< span class = "Constant" > 0< / span > ] < span class = "Keyword" > ?< / span > < span class = "Variable" > < span class = "Variable" > @< / span > app< / span > .< span class = "Entity" > call< / span > : resp
< span class = "Keyword" > end< / span >
< span class = "Keyword" > private< / span >
< span class = "Keyword" > def< / span > < span class = "Entity" > try_next< / span > (< span class = "Variable" > env< / span > )
env.< span class = "Entity" > merge< / span > (< span class = "String" > < span class = "String" > '< / span > PATH_INFO< span class = "String" > '< / span > < / span > => env[< span class = "String" > < span class = "String" > '< / span > PATH_INFO< span class = "String" > '< / span > < / span > ] < span class = "Keyword" > +< / span > < span class = "Variable" > < span class = "Variable" > @< / span > try< / span > [< span class = "Variable" > < span class = "Variable" > @< / span > next< / span > ])
< span class = "Keyword" > end< / span >
< span class = "Keyword" > end< / span >
2010-08-23 13:34:35 +00:00
< span class = "Keyword" > end< / span >
2010-08-25 10:05:23 +00:00
use < span class = "Support" > Rack< / span > ::< span class = "Entity" > TryStatic< / span > ,
< span class = "Constant" > < span class = "Constant" > :< / span > root< / span > => < span class = "String" > < span class = "String" > " < / span > output< span class = "String" > " < / span > < / span > , < span class = "Comment" > < span class = "Comment" > #< / span > static files root dir< / span >
< span class = "Constant" > < span class = "Constant" > :< / span > urls< / span > => < span class = "String" > < span class = "String" > %w[< / span > /< span class = "String" > ]< / span > < / span > , < span class = "Comment" > < span class = "Comment" > #< / span > match all requests < / span >
< span class = "Constant" > < span class = "Constant" > :< / span > try< / span > => [< span class = "String" > < span class = "String" > '< / span > .html< span class = "String" > '< / span > < / span > , < span class = "String" > < span class = "String" > '< / span > index.html< span class = "String" > '< / span > < / span > , < span class = "String" > < span class = "String" > '< / span > /index.html< span class = "String" > '< / span > < / span > ] < span class = "Comment" > < span class = "Comment" > #< / span > try these postfixes sequentially< / span >
errorFile< span class = "Keyword" > =< / span > < span class = "String" > < span class = "String" > '< / span > output/Scratch/en/error/404-not_found/index.html< span class = "String" > '< / span > < / span >
run lambda { [< span class = "Constant" > 404< / span > , {
< span class = "String" > < span class = "String" > " < / span > Last-Modified< span class = "String" > " < / span > < / span > => < span class = "Support" > File< / span > .< span class = "Entity" > mtime< / span > (errorFile).< span class = "Entity" > httpdate< / span > ,
< span class = "String" > < span class = "String" > " < / span > Content-Type< span class = "String" > " < / span > < / span > => < span class = "String" > < span class = "String" > " < / span > text/html< span class = "String" > " < / span > < / span > ,
< span class = "String" > < span class = "String" > " < / span > Content-Length< span class = "String" > " < / span > < / span > => < span class = "Support" > File< / span > .< span class = "Entity" > size< / span > (errorFile).< span class = "Entity" > to_s< / span >
}, < span class = "Support" > File< / span > .< span class = "Entity" > read< / span > (errorFile)] }
2010-08-23 13:34:35 +00:00
< / pre >
< / div > < / div >
< p > and the < code > .gems< / code > file needed to install < code > rack< / code > middlewares.< / p >
< div class = "code" > < div class = "file" > < a href = "/Scratch/en/blog/2010-08-23-Now-heberged-on-heroku/code/.gems" > ➥ .gems < / a > < / div > < div class = "withfile" >
< pre class = "twilight" >
rack
rack< span class = "Keyword" > -< / span > rewrite
2010-08-25 10:05:23 +00:00
rack< span class = "Keyword" > -< / span > contrib
2010-08-23 13:34:35 +00:00
< / pre >
< / div > < / div >
< p > Now, just follow the heroku tutorial to create an application :< / p >
< pre class = "twilight" >
git init
git add .
heroku create
git push heroku master
< / pre >
< p > Now I’ ll should be able to redirect properly to my own 404 page for example.
I hope it is helpful.< / p >
2010-08-25 10:10:27 +00:00
< hr / > < div class = "footnotes" >
< ol >
< li id = "fn:1" >
< p > I was inspired by this < a href = "http://gmarik.info/blog/2010/05/10/blogging-with-jekyll-and-heroku-for-free" > article< / a > . < a href = "#fnref:1" rev = "footnote" > ↩ < / a > < / p >
< / li >
< / ol >
< / div >
2010-08-23 13:34:35 +00:00
< / div >
< div id = "choixrss" >
< a id = "rss" href = "http://feeds.feedburner.com/yannespositocomen" >
Subscribe
< / a >
< / div >
< script type = "text/javascript" >
$(document).ready(function(){
$('#comment').hide();
$('#clickcomment').click(showComments);
});
function showComments() {
$('#comment').show();
$('#clickcomment').fadeOut();
}
document.write('< div id = "clickcomment" > Comments< / div > ');
< / script >
< div class = "flush" > < / div >
< div class = "corps" id = "comment" >
< h2 class = "first" > comments< / h2 >
< noscript >
Vous devez activer javascript pour commenter.
< / noscript >
< script type = "text/javascript" >
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
var idcomments_post_id = '/Scratch/en/blog/2010-08-23-Now-heberged-on-heroku/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/en/blog/2010-08-23-Now-heberged-on-heroku/';
< / script >
< span id = "IDCommentsPostTitle" style = "display:none" > < / span >
< script type = 'text/javascript' src = '/Scratch/js/genericCommentWrapperV2.js' > < / script >
< / div >
< div id = "entete" class = "corps_spaced" >
< div id = "liens" >
< ul > < li > < a href = "/Scratch/en/" > Homepage< / a > < / li >
< li > < a href = "/Scratch/en/blog/" > Blog< / a > < / li >
2010-09-30 13:01:14 +00:00
< li > < a href = "/Scratch/en/softwares/" > Softwares< / a > < / li >
2010-09-28 01:00:51 +00:00
< li > < a href = "/Scratch/en/about/" > About< / a > < / li > < / ul >
2010-08-23 13:34:35 +00:00
< / div >
< div class = "flush" > < / div >
< hr / >
< div id = "next_before_articles" >
< div id = "previous_articles" >
previous entries
< div class = "previous_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/en/blog/2010-07-09-Indecidabilities/" > < span class = "nicer" > «< / span > Undecidabilities (part 1)< / a >
2010-08-23 13:34:35 +00:00
< / div >
< div class = "previous_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/en/blog/2010-07-31-New-style-after-holidays/" > < span class = "nicer" > «< / span > New style after holidays< / a >
2010-08-23 13:34:35 +00:00
< / div >
< div class = "previous_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/en/blog/2010-07-07-CSS-rendering-problems-by-navigator/" > < span class = "nicer" > «< / span > Do not use CSS gradient with Chrome< / a >
2010-08-23 13:34:35 +00:00
< / div >
< / div >
< div id = "next_articles" >
next entries
2010-08-31 13:06:43 +00:00
< div class = "next_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/en/blog/2010-08-31-send-mail-from-command-line-with-attached-file/" > send mail from command line with attached file < span class = "nicer" > »< / span > < / a >
2010-08-31 13:06:43 +00:00
< / div >
2010-08-23 13:34:35 +00:00
2010-09-01 22:29:34 +00:00
< div class = "next_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/en/blog/2010-09-02-base64-and-sha1-on-iPhone/" > base64 and sha1 on iPhone < span class = "nicer" > »< / span > < / a >
2010-09-01 22:29:34 +00:00
< / div >
2010-08-23 13:34:35 +00:00
2010-09-02 14:42:39 +00:00
< div class = "next_article" >
2010-09-28 15:10:12 +00:00
< a href = "/Scratch/en/blog/2010-09-02-Use-git-to-calculate-trusted-mtimes/" > Use git to calculate trusted mtimes < span class = "nicer" > »< / span > < / a >
2010-09-02 14:42:39 +00:00
< / div >
2010-08-23 13:34:35 +00:00
< / div >
< div class = "flush" > < / div >
< / div >
< / div >
< div id = "bottom" >
< div >
< a rel = "license" href = "http://creativecommons.org/licenses/by-sa/3.0/" > Copyright ©, Yann Esposito< / a >
< / div >
< div id = "lastmod" >
2010-08-31 13:06:43 +00:00
Created: 08/23/2010
2010-09-16 11:56:03 +00:00
Modified: 09/16/2010
2010-08-23 13:34:35 +00:00
< / div >
< div >
Entirely done with
< a href = "http://www.vim.org" > Vim< / a >
and
< a href = "http://nanoc.stoneship.org" > nanoc< / a >
< / div >
< div >
< a href = "/Scratch/en/validation/" > Validation< / a >
< a href = "http://validator.w3.org/check?uri=referer" > [xhtml] < / a >
.
< a href = "http://jigsaw.w3.org/css-validator/check/referer?profile=css3" > [css] < / a >
.
< a href = "http://validator.w3.org/feed/check.cgi?url=http%3A//yannesposito.com/Scratch/en/blog/feed/feed.xml" > [rss]< / a >
< / div >
< / div >
< div class = "clear" > < / div >
< / div >
< / body >
< / html >