google-app-enginestatic-html

Serve static file using App Engine


I created an App Engine application. Till now, I only have a few HTML files to serve. What can I do to make App Engine serve the index.html file whenever someone visits http://example.appengine.com/ ?

Currently, my app.yaml file looks like this:

application: appname
version: 1
runtime: python
api_version: 1

handlers:

- url: /
  static_dir: static_files

Solution

  • This should do what you need:

    https://gist.github.com/873098

    Explanation: In App Engine Python it's possible to use regular expressions as URL handlers in app.yaml and redirect all URLs to a hierarchy of static files.

    Example app.yaml:

    application: your-app-name-here
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /(.*\.css)
      mime_type: text/css
      static_files: static/\1
      upload: static/(.*\.css)
    
    - url: /(.*\.html)
      mime_type: text/html
      static_files: static/\1
      upload: static/(.*\.html)
    
    - url: /(.*\.js)
      mime_type: text/javascript
      static_files: static/\1
      upload: static/(.*\.js)
    
    - url: /(.*\.txt)
      mime_type: text/plain
      static_files: static/\1
      upload: static/(.*\.txt)
    
    - url: /(.*\.xml)
      mime_type: application/xml
      static_files: static/\1
      upload: static/(.*\.xml)
    
    # image files
    - url: /(.*\.(bmp|gif|ico|jpeg|jpg|png))
      static_files: static/\1
      upload: static/(.*\.(bmp|gif|ico|jpeg|jpg|png))
    
    # index files
    - url: /(.+)/
      static_files: static/\1/index.html
      upload: static/(.+)/index.html
    
    # redirect to 'url + /index.html' url.
    - url: /(.+)
      static_files: static/redirector.html
      upload: static/redirector.html
    
    # site root
    - url: /
      static_files: static/index.html
      upload: static/index.html
    

    In order to handle requests to URLs that don't end with a recognized type (.html, .png, etc.) or / you need to redirect those requests to URL + / so the index.html for that directory is served. I don't know of a way to do this inside the app.yaml, so I added a javascript redirector. This could also be done with a tiny python handler.

    redirector.html:

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <script language="JavaScript">
          self.location=self.location + "/";
        </script>
      </head>
      <body>
      </body>
    </html>