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

Ton*_*ony 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  1. 通过动态处理程序路由所有请求,该处理程序写出有效URL的内容,或为无效URL写入错误页面。我不喜欢这样,因为它的效率远远低于让GAE提供静态文件的效率。
  2. 声明一个与每个静态文件明确匹配的单独的静态处理程序,然后在底部放置一个“全部捕获”处理程序-我也不喜欢这种方法,因为这会导致处理程序列表很长。

在这种情况下,还有另一种方法来设置适当的404页面吗?

小智 7

为那些会发现它有用的人回答旧线程。

  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
Run Code Online (Sandbox Code Playgroud)

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

这里有一个很大的免责声明:require_matching_file没有记录。但事实证明,app.yaml当您上传该字段时,GAE 会自动将该字段添加到您的字段中。


N.P*_*N.P -1

尝试“错误处理程序”。

error_handlers:
 - file: custom_404.html
Run Code Online (Sandbox Code Playgroud)

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