【发布时间】:2012-05-14 00:12:18
【问题描述】:
昨天我们在当地的JUG 进行了 Play 2.0 演示,但我们无法确定是否可以使用本地化 URL(用于 SEO 目的)。
例如 /help、/hilfe 等应该指向同一个控制器,但模板应该使用不同的语言内容呈现。
在 Play 2.0 中有什么方法可以做到这一点吗?
【问题讨论】:
标签: url seo playframework-2.0
昨天我们在当地的JUG 进行了 Play 2.0 演示,但我们无法确定是否可以使用本地化 URL(用于 SEO 目的)。
例如 /help、/hilfe 等应该指向同一个控制器,但模板应该使用不同的语言内容呈现。
在 Play 2.0 中有什么方法可以做到这一点吗?
【问题讨论】:
标签: url seo playframework-2.0
我喜欢你的问题,因为它至少对我来说很有创意 :) 检查这种方法是否适合我:
conf/routes:
GET /help controllers.Application.helpIndex(lang = "en")
GET /hilfe controllers.Application.helpIndex(lang = "de")
GET /help/:id controllers.Application.helpTopic(lang = "en", id: Long)
GET /hilfe/:id controllers.Application.helpTopic(lang = "de", id: Long)
controllers/Application.java:
public static Result helpIndex(String lang) {
return ok("Display help's index in " + lang.toUpperCase());
}
public static Result helpTopic(String lang, Long id) {
return ok("Display details of help topic no " + id + " in " + lang.toUpperCase());
}
views/someView.scala.html:
<a href="@routes.Application.helpIndex("en")">Help index</a><br/>
<a href="@routes.Application.helpIndex("de")">Hilfe index</a><br/>
<a href="@routes.Application.helpTopic("en", 12)">Help topic no 12</a><br/>
<a href="@routes.Application.helpTopic("de", 12)">Hilfe topic no 12</a>
【讨论】:
(这与previous answer 中的方法不同,因此单独添加)
您还可以在 DB 中创建某种mapping table,您可以在其中存储具有不同参数的记录的完整路径:
urlpath record_id lang
/help/some-topic 12 en
/hilfe/ein-topic 12 de
在conf/routes 文件中,您需要使用允许您使用Dynamic parts spanning several / 的规则(参见routing doc),即:
GET /:topic controller.Application.customDbRouter(topic:String)
您也可以混合使用这两种 - 标准路由机制和自定义路由机制返回notFound()结果。
【讨论】:
您使用 from GlobalSettings.onHandlerNotFound() 并检查是否是 url 的翻译版本。然后,您可以进行重定向。然而,这以默认语言的 url 结尾。
更简洁的是使用GlobalSettings.onRouteRequest,您可以在其中实现自己的逻辑来获取处理程序。
此外,您还可以创建自己的路由器。在google-groups 与scala solution 进行了讨论。
【讨论】:
据我所知,在 Play 1.2.x 中是可能的,而不是在 2.x 中。我的意思是,如果不复制文件中的映射、为 EN 添加一个、为 DE 添加一个等,这是不可能的。
一种更简单的 SEO 替代方法可能是“伪造”站点地图文件中的网址。
所以你的 Routes 文件有
GET /action/:param/:seo-string Controller.methodAction(param)
所以seo-string 将在处理过程中被忽略,并且您会在站点地图文件中生成多个链接:
/action/1/english-text
/action/1/german-text
这将设置搜索引擎。对于用户,他们可以看到正确语言的 URL,您可以使用 HTML 5 历史记录更改 URL。
这是额外的工作,但如果你真的想要......
【讨论】: