将 Google Page Creator 迁移到 Google App Engine

Addition V1,现在本文有个英文版啦。

今年 6 月, Google Page Creator 即将停止服务,一个免费的网页存储空间就这样凭空消失了。而对于老用户而言,伴随而来的,还有寻找替代空间所带来的无端痛苦。虽然, Google 提供了将 Google Page Creator 迁移到 Google Sites 的方案,但由于 Google Sites 不支持 JavaScript 和 CSS 等功能,对于许多将 Blogger 的脚本代码存放在 Google Page Creator 的用户而言,这个方案显然并不合适。

其实,相对于 Google Sites, Google 的另一个服务,作为云计算平台的 Google App Engine 更适合作为替代 Google Page Creator 的脚本宿主服务器——毕竟, App Engine 本身就是个在线服务器,可以存储任何容量小于 1MB 的静态文件(一般单个的图片、网页和脚本文件的容量都不会超过 1MB) Google 的新规则允许存储任何容量小于 10MB 的静态文件,文件总数量可达 1000 个。(Updated on 6/19/2009)

Google App Engine 本身相当强大,作为动态服务器,支持 Python 和 Java 代码的页面。但是将 Google App Engine 做为静态文件服务器,只需要适当了解 app.yaml 文件的配置本地测试文件项目上传即可——将需要上传的文件在本地目录下安排好,设置 app.yaml 下的 URL 和上传文件之间的映射关系,调用本地模拟环境进行测试,确保无误后上传。

以本人的两个 Google Page Creator 网站 alpha.roc.googlepages.com 和 alpha0roc.googlepages.com 为例。前者用于放置 JavaScript 的小 Demo,后者用于放置 Blogger 的脚本、图片和下载文件。迁移后,两个网站分别重定向到 alpha0rocdemo.appspot.com 的 demo 目录(此目录包含 index.html 文件,可直接通过页面访问) 和 blog 目录(此目录仅包含图片、脚本等资源,无法直接访问)。由于 Google Page Creator 只支持单层的目录结构,而 Google App Engine 却支持多层次的目录结构,为了使得目录结构更清晰,在迁移时将单层目录结构下的文件分置于多个不同的目录,并通过设置 app.yaml,实现 URL 和上传文件之间的映射关系。

以下是 app.yaml 的 handlers 部分内容,设定了 URL 和上传文件之间的映射关系:
handlers:
- url: /demo/(.+)
  static_files: demo/\1
  upload: demo/(.+)
- url: /demo/.*
  static_files: demo/index.html
  upload: demo/index.html
 
- url: /blog/download
  static_dir: blog/download
- url: /blog/(.*\.(gif|png|jpg|ico|css|js))
  static_files: blog/template/\1
  upload: blog/template/(.*\.(gif|png|jpg|ico|css|js))
- url: /blog/(.*)
  static_files: blog/download/\1
  upload: blog/download/(.*)
 
- url: /.*
  script: index.py
以下为上传的文件目录结构:
|-- app.yaml # app.yaml 配置文件放在根目录下
|-- blog     # 对应 http://alpha0roc.googlepages.com/,不包含 HTML 文件。将原单层目录下的
|   |        # 下载文件置于 download 中,图片、脚本文件置于 template 中
|   |-- download # app.yaml 中的 09-10 保证对于 download 目录
|   |   |        # 将来的文件下载可直接使用 http://alpha0rocdemo.appspot.com/blog/download 目录
|   |   |        # app.yaml 中的 14-16 保证了对原 Page Creator 目录的兼容
|   |   |        # 若下载文件格式非 gif、png、jpg、ico、css、js,则转向到 download 目录
|   |   |-- DatabaseV20070511.accdb
|   |   |-- LineCount.py
|   |   |-- PolaroidsPhotos.atn
|   |   |-- fanfou.v08.py
|   |   |-- fanfou.v09.py
|   |   `-- gongfan2.tar.bz2
|   `-- template # app.yaml 中的 11-13 保证了对原 Page Creator 目录的兼容
|       |        # 若下载文件格式为 gif、png、jpg、ico、css、js,则转向到 template 目录
|       |-- author.png
|       |-- bg.jpg
|       |-- blogicon.ico
|       |-- comh3.png
|       |-- commentbck.png
|       |-- cup.png
|       |-- fanfou.js
|       |-- footer-wp.png
|       |-- footer2.png
|       |-- ie60.css
|       |-- listseparator.png
|       |-- logo.png
|       |-- mainmidpart.png
|       |-- maintoppart.png
|       |-- menu2ie.png
|       |-- menu_button2.png
|       |-- quotes.gif
|       |-- recommendation.js
|       |-- righthead.png
|       |-- rssicon.png
|       |-- searchbck.png
|       |-- sidebarbottom.png
|       |-- sidebarmid.png
|       |-- sidebartop.png
|       |-- socialbcklk6.png
|       |-- twinfish_100.png
|       |-- widgetbck.png
|       `-- widgeth2.png
|-- demo     # 对应 http://alpha.roc.googlepages.com/,包含 HTML 文件。将原单层目录下的
    |        # Demo 项目相关文件置于各自 Demo 目录中
    |-- GongfanAdv   # 一个 Demo 项目,原访问地址为
    |   |            # http://alpha.roc.googlepages.com/gongfan2.htm
    |   |            # 在 demo 目录下添加一个 gongfan2.htm 页面,
    |   |            # 通过 meta refresh 跳转到本目录的 gongfan2.htm
    |   |-- favorite.png
    |   |-- geocode.js
    |   |-- gongfan.js
    |   |-- gongfan2.htm
    |   |-- logo.png
    |   `-- mail.png
    |-- gongfan2.htm # 为了保持地址兼容而添加的跳转页面
    |
    |-- index.html   # app.yaml 中的 05-07 保证对于 index.html 的访问
    |
    `-- template     # 原为网页模板目录,目录名为“-”
        `            # 因 App Engine 无法上传“-”目录故而改为 template
        `            # 因本人只有一个 HTML 文件使用到网页模板,故而直接修改了该网页中的模板路径
        `            # 若有许多 HTML 文件依赖该网页模板,则可通过设置 app.yaml 实现 URL 地址的转向
        `            # url: /-/(.+)
        `            # static_files: demo/template/\1
        `            # upload: demo/template/(.+)
        `-- includes
            `-- style
                `-- lagoona
                    `-- icy
                        |-- 3c-alt-bottom.gif
                        |-- 3c-alt-top.gif
                        |-- body-bg.gif
                        |-- footer-bg.gif
                        |-- h2-bg.gif
                        |-- h3-bg.gif
                        |-- h4-alt-bg.gif
                        |-- h5-bg.gif
                        |-- header.gif
                        |-- hr-bg.gif
                        |-- ollist-bg.gif
                        |-- sidebar-list-bg.gif
                        `-- ullist-bg.gif
现在,此博客上的背景图片, JavaScript 脚本和 CSS 样式表都是从 alpha0rocdemo.appspot.com 读取过来了。虽然 Google App Engine 对于每天的访问请求数,带宽流量大小等都有限制,但对于一个个人博客而言,这些限制量应该是足够的了。