Contributed by
Nicolas Grekas
in #26283.

历史上看,URL遵循的是 UNIX 约定,对目录添加斜杠,对文件则去除斜杠:

  • https://example.com/foo/ 通常被认为是一个名为 foo 的目录
  • https://example.com/foo 通常被认为是一个名为 foo 的没有扩展名的文件

虽然对 /foo/foo/ 分别伺服不同的内容 对 Google 来说是 ok 的,今日一般把它们当作是相同的URL,并且在其间跳转。

Symfony 打从地起就在帮你搞定此一问题的两个方面。如果你定义一个带有斜杠的路由,两种URL方式都工作,并且没有斜杠的会跳到另外一个上面去:

1
2
3
4
# config/routes.yaml
foo_route:
    path: '/foo/'
    controller: App\Controller\DefaultController::foo

本例中 GET /foo/ 请求,返回一个 200 响应,而 GET /foo 请求返回一个 301 (Moved Permanently / 永久删除) 的指向 /foo/ 的重定向。 注意这只工作在 GETHEAD 请求上面。

在 Symfony 4.1 我们改进了路由,以便能通过其他方式更智能地重定向。思考以下路由定义:

1
2
3
4
# config/routes.yaml
foo_route:
    path: '/foo'
    controller: App\Controller\DefaultController::foo

Symfony 4.1 之前,GET /foo/ 请求会带来一个 404 响应。在 Symfony 4.1 中,它带来的是 301 指向 /foo 的重定向,最终令结尾斜杠处的逻辑能够在两种方式下运行。