scalajs-react Play 应用程序上漂亮的 URL(没有“#”)
Pretty URLs (without '#') on scalajs-react Play app
在 scalajs-react
路由器的文档中,@japgolly cautions users of the library that starting URLs with '/' slashes requires additional server configuration。
为了允许没有 #
的漂亮 URL,到目前为止,我已经尝试在 Play routes
文件中编写一个包罗万象的路由,如下所示:
# Home page
GET / com.xyz.controllers.Application.index(path: String = "")
...
# Catch-all route
GET /*path com.xyz.controllers.Application.index(path: String)
与 Application.scala
中匹配的索引路径
def index(path: String = "") = Action {
Ok(views.html.index("Title"))
}
最后在前端使用RouterConfigDsl
声明的路由:
def create = Router(BaseUrl.until_#, RouterConfigDsl[Loc].buildConfig { dsl =>
import dsl._
( emptyRule
| staticRoute(root, DashboardLoc) ~> render(filler("Dashboard"))
| staticRoute("purchase-orders", PurchaseOrdersLoc) ~> render(filler("Purchase Orders"))
| staticRoute("dashboard", DashboardLoc) ~> render(filler("Dashboard"))
| staticRoute("items", ItemsLoc) ~> render(ItemGallery())
| staticRoute("customers", CustomersLoc) ~> render(filler("Customers"))
| staticRoute("sales-orders", SalesOrdersLoc) ~> render(filler("Sales Orders"))
| staticRoute("preorders", PreordersLoc) ~> render(filler("Pre-orders"))
).notFound(redirectToPage(DashboardLoc)(Redirect.Replace))
.setTitle(l => s"XYZ | ${l.name}")
}.renderWith(layout))
运行 在本地,我让应用程序在 localhost:9000/dashboard
处自动重定向到 DashboardLoc
,其他静态路由在网络应用程序中单击它们时有效,但在重新加载时失败。
事实证明,问题毕竟是使用 BaseUrl.until#
而不是 BaseUrl.fromWindowOrigin_/
。现在所有路线都按预期工作。
在 scalajs-react
路由器的文档中,@japgolly cautions users of the library that starting URLs with '/' slashes requires additional server configuration。
为了允许没有 #
的漂亮 URL,到目前为止,我已经尝试在 Play routes
文件中编写一个包罗万象的路由,如下所示:
# Home page
GET / com.xyz.controllers.Application.index(path: String = "")
...
# Catch-all route
GET /*path com.xyz.controllers.Application.index(path: String)
与 Application.scala
def index(path: String = "") = Action {
Ok(views.html.index("Title"))
}
最后在前端使用RouterConfigDsl
声明的路由:
def create = Router(BaseUrl.until_#, RouterConfigDsl[Loc].buildConfig { dsl =>
import dsl._
( emptyRule
| staticRoute(root, DashboardLoc) ~> render(filler("Dashboard"))
| staticRoute("purchase-orders", PurchaseOrdersLoc) ~> render(filler("Purchase Orders"))
| staticRoute("dashboard", DashboardLoc) ~> render(filler("Dashboard"))
| staticRoute("items", ItemsLoc) ~> render(ItemGallery())
| staticRoute("customers", CustomersLoc) ~> render(filler("Customers"))
| staticRoute("sales-orders", SalesOrdersLoc) ~> render(filler("Sales Orders"))
| staticRoute("preorders", PreordersLoc) ~> render(filler("Pre-orders"))
).notFound(redirectToPage(DashboardLoc)(Redirect.Replace))
.setTitle(l => s"XYZ | ${l.name}")
}.renderWith(layout))
运行 在本地,我让应用程序在 localhost:9000/dashboard
处自动重定向到 DashboardLoc
,其他静态路由在网络应用程序中单击它们时有效,但在重新加载时失败。
事实证明,问题毕竟是使用 BaseUrl.until#
而不是 BaseUrl.fromWindowOrigin_/
。现在所有路线都按预期工作。