Take the 2-minute tour ×
Webmasters Stack Exchange is a question and answer site for pro webmasters. It's 100% free, no registration required.

I have the following Hello world code for my Heroku app. Also in my project's root folder, I have a favicon.ico.

import os
from flask import Flask
app = Flask(__name__)

html = '''
<!doctype html>
<html>
  <head>
    <link rel="shortcut icon" href="/favicon.ico">
    <title>Hello world!</title>
  </head>
  <body>
    <p>Hello world!</p>
  </body>
</html>
'''

@app.route('/')
def index():
    return html

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

When I browse to my app, I don't see a favicon. Also, when I check heroku logs, I get the following 404 line:

2012-02-14T05:23:29+00:00 app[web.1]: <ip.ad.dr.es> - - [14/Feb/2012 05:23:29] "GET /favicon.ico HTTP/1.1" 404 -
share|improve this question
add comment

3 Answers

I just found it right here: http://flask.pocoo.org/docs/patterns/favicon/

I varied from it a bit and here's what I did:

  1. In my tree, I store the icon as static/images/favicon.ico
  2. In the HTML, I have the following line in the <head>:

    <link rel="shortcut icon" href="/favicon.ico">
    
  3. In my Flask app, I have the following URL handler for /favicon.ico

    @app.route('/favicon.ico')
    def favicon():
        return send_from_directory(os.path.join(app.root_path, 'static', 'images'),
                                   'favicon.ico', mimetype='image/png')
    

    Why image/png? Because if I use image/vnd.microsoft.icon, then I browse to http://myapp.heroku.com/favicon.ico, I get a download dialog box. image/png just displays the favicon on the page (at least on Chrome).

share|improve this answer
add comment

Here is what I use:

<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">

I believe the "shortcut" should be in there for Internet Explorer (although IE will usually check for a favicon regardless).

However, it sounds like the icon is in the wrong location. You should be able to access it via yoursite.com/favicon.ico. You could also check by viewing the page source in Google Chrome and /favicon.ico will be an underlined link - click that to open the location you have specified.

UPDATE: Do you have a .htaccess file? From what you have said, it sounds like you need to make an exception for existing files to bypass the app. If you are using Apache you'd use something like this:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule your_rule_here [L]

There should be an equivalent for the platform you are using.

share|improve this answer
    
Is this on Flask? I think Flask looks for a handler script for every URL GET sent to it. I still get 404's. –  Kit Feb 15 '12 at 0:33
    
@Kit Sorry, to be honest I don't know anything about Heroku or Flask. I just assumed the app worked fine but outputted some incorrect HTML. –  DisgruntledGoat Feb 15 '12 at 0:43
add comment

I put my favicon.ico image in my public/ folder in my rails app. Then I deployed to heroku and had to clear my browser cache before the new one showed up.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.