【问题标题】:How to match urls in app.yaml based on query parameters?如何根据查询参数匹配 app.yaml 中的 url?
【发布时间】:2015-01-26 05:33:41
【问题描述】:

我目前将路径以 /app 开头的任何请求路由到单个静态文件,该文件使用 Javascript 进行路由。

现在,我想支持 Google 的 ajax 抓取协议,这意味着我必须在任何以 /app 开头并以 ?_escaped_fragment= 结尾的网址返回 HTML 快照。

我有这两个处理程序:

- url: /app\?_escaped_fragment=
  script: main.app

- url: /app(/.*)?
  static_files: static/pages/app.html
  upload: static/pages/app\.html

但对/app?_escaped_fragment= 的请求仍会路由到静态页面。有没有办法匹配查询参数?

我知道我可以将 /app(/.*)? 路由到一个脚本,该脚本返回静态页面或基于查询参数的存在的快照,但提供静态文件要便宜得多,所以我只想请求访问我的应用服务器的查询参数。

【问题讨论】:

    标签: google-app-engine app.yaml


    【解决方案1】:

    虽然很好,但如果您阅读规范,则处理程序部分仅用于路径上的 REGEXP 匹配,而不是查询参数。如果您使用 RESTful 原则设计应用程序,则可以轻松地将查询参数访问转换为基于 URI 的访问。只需根据/app/escaped_fragment/.* 路由并在处理程序函数中检查路径的其余部分,以查找正在请求哪个特定类型的 escaped_fragment 资源。

    【讨论】:

    • 感谢您的回答。我想那时我将不得不写一个脚本。我很想回复对 /app/*/_escaped_fragment_ 的请求,但这不起作用,因为 Google 想向 ?_escaped_fragment= 发送请求。 developers.google.com/webmasters/ajax-crawling/docs/…
    • 啊,对不起,我错过了您的用例本身,多么尴尬...是的,如果您无法控制通过查询参数完成的请求,则必须包含一个控件每个处理程序中的流分支。我建议使用一个函数扩展 webapp2.RequestHandler 以响应这种特殊请求模式,通过该类对所有处理程序进行子类化,并在每个 doGet\doPost 函数的顶部调用您定义的超类的成员函数,即负责对此进行检查。
    【解决方案2】:

    这不是您在 app.yaml 中要做的事情。这些请求仍应路由到您的处理程序,在那里他们可以检查请求参数并根据需要返回 JSON 或 HTML。

    【讨论】:

    • 在这种情况下,我觉得很奇怪我可以根据路径进行路由,但不能在 app.yaml 中查询参数。
    猜你喜欢
    • 2021-07-17
    • 2016-07-21
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2011-11-23
    相关资源
    最近更新 更多