【问题标题】:Remove .html extension using Google Appengine with Java使用带有 Java 的 Google Appengine 删除 .html 扩展名
【发布时间】:2015-12-11 02:30:24
【问题描述】:

我在这里感到非常困惑。我一直在为我们的网络服务器使用 Google Appengine,到目前为止效果很好,但是我要求在没有 .html 扩展名的情况下加载网页。我一直在阅读,发现我需要创建一个app.yaml 文件来将 url 映射到其他东西?到目前为止,这是我的文件中的内容:

application: company-website
version: 1
runtime: java
threadsafe: true

handlers:
  - url: /about
  script: about.html

我一直在尝试在他们的文档站点上阅读如何执行此操作,但我似乎找不到任何关于如何删除扩展名并且仍然指向正确的 html 文件的内容。谁能帮我吗?我也可以在appengine-web.xml 文件中执行此操作吗?看来我可以在那里完成而不创建 app.yaml 文件。

任何帮助将不胜感激。谢谢!

编辑:尝试了更多的东西。尝试将我试图删除扩展名的文件移动到它自己的文件夹中,如下所示:

/root
  -index.html
  -/about
     -index.html

这没关系,当我输入 domain.com/about/ 时,它似乎可以正常工作,但当我输入 domain.com/about 时,它却没有。非常沮丧。

【问题讨论】:

  • 看看这个解决方案:stackoverflow.com/a/20220633/3245762
  • 那个答案是针对 python 的,当我在 Java 中尝试这个时,它不承认 mime_type 是处理程序的属性,所以我不相信 Java 有这些选项
  • 我不知道java,但是在python中你可以设置strict_slash=True,表示你需要或不需要输入额外的/
  • 关于您的编辑:如果以“about”开头的所有内容的重定向应转到 about/index.html,则处理程序中的 url 必须看起来像 url: /about.*。不过不确定script 部分。逻辑上应该是static_files: about/index\.html,但这是我对正则表达式和mod_rewrite的感觉。

标签: java html google-app-engine


【解决方案1】:

在理想情况下,我们可以选择在底层 Web 服务器中配置类似 apache 的 mod_rewrite 的重写。遗憾的是,无法在这样的级别上配置重写。

我搜索了一下,发现最常见的重写答案是用户 UrlRewriteFilterwire up the servlets yourself。这两个选项都在

中进行了解释

两者的工作方式相同,都需要应用通过应用引擎提供静态内容。由于所有静态文件都从 Google 的内容交付网络 (cdn) 移动到瓶颈应用程序,这将导致应用程序引擎实例数小时和响应速度变慢。这些方法可能还需要您将静态文件部署为资源 (How-To configure static-files and resources),至少我以前是这样做的。

这些是您拥有的“纯 Java”选项。 Josep Valls 描述的 app.yaml 方法将适用于 App Engine 上的 Java。这里的主要问题是 app.yaml 配置是否足够低级以成为谷歌在其 cdn 中识别的重写,或者您是否仍将消耗实例时间,因为所有内容都是通过实例提供的。

documentation 告诉我们:

为了提高效率,App Engine 分别存储和提供静态文件 从应用程序文件。静态文件在 应用程序的文件系统。如果您有需要读取的数据文件 通过应用程序代码,数据文件必须是应用程序文件,并且 不能与静态文件模式匹配。

由于这是在解释如何配置静态文件模式处理程序的部分之前,因此应该假设此类处理程序的配置不会破坏上述逻辑 - 即 p>

将静态文件与应用程序文件分开存储和提供服务

这个假设是否正确是一个简单的实验,我将在给定的时间内进行并在这里报告我的发现。

这些是我能找到和知道的所有现有选项。如果有人对此主题有更多了解,请发表评论/回复。

编辑 (7.12.2015) 我的 maven 目标 appengine:devserver 完全没有注意到 app.yaml 中的设置。我将不得不在接下来的部署阶段之一中对此进行试验,或者使用mvn gcloud:run

...那天晚些时候:

通过 Servlet 重写 URL(如 Paul Tuckey's UrlRewriteFilter)不适用于静态文件。您必须将文件部署为资源文件。静态文件驻留在其他地方,如果被 servlet 转发,则不会被找到。至少我是这么理解的。

【讨论】:

    【解决方案2】:

    在 Python 和 Go 中,您可以在 url 处理程序中使用正则表达式匹配;如果 Java 也使用 app.yaml 你可能会这样做:

    - url: /(about|other|sections)$
      static_files: \1\.html
    

    【讨论】:

    • 谢谢! app.yaml 在 Java 运行时工作,但它会导致覆盖通常用于配置 Java 应用程序的 web.xml 和 appengine-web.xml 文件。 (来源:books.google.com/…)。 BTW,上面的表达式中\1的作用是什么?
    • 当您在正则表达式中使用括号时,您可以使用 \1--\99 来引用每个匹配项;即,如果您的正则表达式类似于 /(\w+)/(\w+)/ 那么您可以使用 \1 替换路径的第一部分和 \2 第二部分。在此处查看更多信息:rexegg.com/regex-capture.html
    • @JosepValls 我很好奇。我们(所有人)都知道,应用引擎上的静态内容是通过 Google 的 CDN 缓存和交付的。但是,如果您要使用 Java servlet 重写 URL,则必须通过应用引擎路由请求,从而绕过 CDN。在您建议的方法中,请求是否会首先命中应用程序引擎实例,或者配置是否足够低级(如服务器配置)以将重写的内容公开为静态并因此由 CDN 缓存和提供服务?简短:重写会导致应用引擎生成实例吗?
    • @konqi 这是一个有趣的问题,我没有答案。我想知道 static_dir 和 static_files 的处理方式是否相同。我的猜测是它需要一个正在运行的实例来映射您的正则表达式。但是,如果您打算将 GAE 用作 CDN,它可能不是最好的:serverfault.com/questions/133157/…
    猜你喜欢
    • 2016-12-28
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2022-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多