适用于静态文件的Google App Engine自定义404页面

时间:2016-05-06 23:05:04

标签: python google-app-engine google-app-engine-python

我正在研究一个主要由静态内容组成的GAE应用程序。我配置了以下处理程序:

- url: /content/(.*\..*)
  static_files: static/content/\1
  upload: static/content/(.*)

- url: /content/(.+)
  static_files: static/content/\1.html
  upload: static/content/(.*)\.html

第一个处理程序用于提供图像,样式表等;第二个处理像/content/zoo/monkeys/george这样的普通URL,并提供相应的HTML文件。

现在,如果没有相应的URL静态文件,GAE将返回一个空页面。我想为这些案例设置一个自定义的404页面,但显然这并不简单。

对类似问题的回答建议放一个" catch-all"我的app.yaml底部的处理程序,RequestHandler生成错误页面。 不过,/content/(.+)会匹配/content/下的所有网址,无论是否有效,这意味着这样的处理程序不会被调用。

我只能想到另外两个解决方案:

  1. 通过动态处理程序路由所有请求,动态处理程序为有效URL写入内容,或为无效URL写入错误页面。我不喜欢这样,因为它比让GAE提供静态文件效率低得多。
  2. 声明一个单独的静态处理程序,该处理程序显式匹配每个静态文件,然后放入一个" catch-all"底部的处理程序 - 我也不喜欢这样,因为它会导致一长串的处理程序。
  3. 是否有另一种方法可以为此案例设置合适的404页面?

2 个答案:

答案 0 :(得分:1)

为那些认为有用的人提供一个旧线程。

  1. 添加require_matching_file: true作为处理程序的最后一个属性。

    如果没有相应的文件,则将调用瀑布中的下一个处理程序,而不是生成默认的404页面。

  2. 然后在app.yaml的底部添加一个具有处理无效URL的动态处理程序的新的全包部分

示例:

- url: /content/(.*\..*)
  static_files: static/content/\1
  upload: static/content/(.*)
  require_matching_file: true

- url: /content/(.+)
  static_files: static/content/\1.html
  upload: static/content/(.*)\.html
  require_matching_file: true

- url: /.*
  script: auto

这样,GAE将通过前2个处理程序为所有现有的静态资产提供服务。仅对不存在的URL调用动态处理程序。您显然需要为此编写代码...

此处有一个重要的免责声明:require_matching_file未记录。但是事实证明,GAE在您上载该字段时会自动将其添加到您的app.yaml中。

答案 1 :(得分:-1)

尝试'error_handlers'。

error_handlers:
 - file: custom_404.html

GAE App.yaml documentation - 每个文件条目表示应该提供的静态文件来代替通用错误响应。如果指定的文件元素没有相应的error_code元素,则静态文件将成为应用程序的默认错误页面。