【问题标题】:Google App Engine custom 404 page for static files静态文件的 Google App Engine 自定义 404 页面
【发布时间】:2016-09-02 03:08:39
【问题描述】:

我正在开发一个主要由静态内容组成的 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 页面,但显然这并不简单。

类似问题的答案建议在我的app.yaml 底部放置一个“包罗万象”的处理程序,并带有一个生成错误页面的RequestHandler。 但是,/content/(.+) 匹配 /content/ 下的所有 URL,无论是否有效,这意味着不会调用此类处理程序。

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

  1. 通过动态处理程序路由所有请求,该处理程序会为有效 URL 写出内容,或为无效 URL 写出错误页面。我不喜欢这样,因为它比让 GAE 提供静态文件的效率要低得多。
  2. 声明一个单独的静态处理程序,显式匹配每个静态文件,然后在底部放置一个“catch-all”处理程序——我也不喜欢这样,因为它会导致一长串处理程序。

是否有另一种方法可以为这种情况设置适当的 404 页面?

【问题讨论】:

  • 我认为你已经把自己画到了一个角落。 Appengine 在设计时并未考虑到这种用例。

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


【解决方案1】:

为那些认为有用的人回答一个旧线程。

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

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

  2. 然后在app.yaml 的底部添加一个新的catch-all 部分,其中包含处理无效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

【讨论】:

  • 我不知道你是怎么知道这件事的,但是谢谢!
  • 没有成功——我猜require_matching_file 不再使用,或者这只适用于static_files 但不适用于static_dir
【解决方案2】:

试试“error_handlers”。

error_handlers:
 - file: custom_404.html

来自GAE App.yaml documentation - 每个文件条目都指示一个静态文件,应代替一般错误响应提供服务。如果您指定的文件元素没有对应的 error_code 元素,则静态文件将是您应用的默认错误页面。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多