【问题标题】:Do not allow ".xml"/".html"/"index" in URI?不允许在 URI 中使用“.xml”/“.html”/“index”?
【发布时间】:2013-05-19 21:38:32
【问题描述】:

我在 Section 3.2 SiteMap of Simply Lift 中了解 Lift 的基础知识,有一件事让我印象深刻。

使用默认的SiteMap 代码,您可以通过三种 方式请求info 视图:

  • GET /info,
  • GET /info.html,
  • GET /info.xml(为什么?)。

此外,您可以通过四种不同的方式请求index查看:

  • GET /,
  • GET /index,
  • GET /index.html,
  • GET /index.xml

如何将此行为限制为 GET / 用于目录和 GET /info 用于文件?


P.S.所有这些都返回200 OK

一个资源不应该只有一个 URL 吗?

【问题讨论】:

  • 这种行为的缺点是什么?哪方面不好?
  • @VasyaNovikov,也许是搜索引擎机器人的方式。 :) 我的意思是......没有机器人应该想出.html/.xml URL,但/dir/index/dir/ 很有可能(例如自动生成的菜单使用/dir/index 链接)。

标签: request httprequest lift


【解决方案1】:

实际上可以解析的方式不止四种。可以在here 找到已知后缀的完整列表(其中任何一个都可用于访问该页面)。

我认为这样做的原因是提升可用于服务任何资源,因此默认情况下大多数都是显式添加的。

我认为您可以通过将其添加到 Boot.scala 来禁用 Lift 对所有扩展的处理:

LiftRules.explicitlyParsedSuffixes = Nil

但是,我不建议这样做,因为可能会有一些副作用。

使用ReqRestHelper 可以显式指定后缀,但我不知道Sitemap 是否有这样的构造。

【讨论】:

  • “一些副作用”?听起来很吓人。
  • 这么多链接指向一个视图,这很有趣。也许SiteMap 的实现应该改变?据我了解,它仅用于动态 HTML 页面。不过,您的代码可以工作(至于后缀,/index 问题仍然存在)。 Nil 不能用于 Sets、Set()Set.empty 可以解决问题(请参阅 stackoverflow.com/questions/10506226)。谢谢!
  • 索引是一个非常标准的约定。大多数网络服务器都有一个用于创建默认文档的结构(apache 中的目录索引,nginx 中的索引等),它在内部将/ 的请求重定向到默认文档 - 并且两者都响应。我认为没有办法禁用它。 Lift 也使用了这个约定,我很确定大多数搜索引擎都考虑到了这一点。您可以在野外找到许多示例,例如:nytimes.comnytimes.com/index.htmlfacebook.comfacebook.com/index.php
【解决方案2】:

实际上,判断Lift是否应该处理请求的代码是here。您可以直接在上面的liftHandled 方法中看到默认扩展名,但它们都可以用LiftRules.liftRequest 覆盖。比如:

LiftRules.liftRequest append {
  case r => Full(r.path.suffix.trim == "")
}

应该做的伎俩。

至于为什么会这样工作,Jason 是对的,Lift 旨在处理多种类型的动态资源。

【讨论】:

  • 1) +1 获取 repo 的链接,我想这仍然是获取 Lift 的最佳方式。 :) 2) 您的代码只能在没有 Full() 包装器的情况下编译,但它并不能解决问题。 :
猜你喜欢
  • 2021-06-26
  • 2012-07-18
  • 2013-12-10
  • 2018-11-06
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多