Contributed by
Paweł Smoliński
in #26213.

在 web 程序中使用 301 HTTP 状态码来实现永久重定向是很常见的,而 302 状态码则是临时重定向。但是,这些重定向类型有一个问题是,因历史原因而重定向时, POST 请求被转换成 GET 请求(重定向到一个 POST 请求无法在老旧浏览器中工作)。

为了解决这个问题, HTTP 协议引入了两个全新的状态码:

  • 307 (临时重定向): 定义在 RFC 7231 中,类似于 302(Found), 除了它不允许把 POST 请求method 改成 GET
  • 308 (永久重定向): 定义在 RFC 7538 中,类似于 301 (Moved Permanently), 除了它不允许把 POST 请求 method 改成 GET

在 Symfony 4.1 中,通过把全新的 keepRequestMethod 参数添加到 redirectAction(),以及 RedirectController 中的 urlRedirectAction() 方法中,我们增加了对这些新的重定向类型的支持。你也可以在路由定义中把它作为 keepRequestMethod 的选项来使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
route_301:
    # ...
    defaults:
        # ...
        permanent: true

route_302:
    # ...
    defaults:
        # ...
        permanent: false

route_307:
    # ...
    defaults:
        # ...
        permanent: false
        keepRequestMethod: true

route_308:
    # ...
    defaults:
        # ...
        permanent: true
        keepRequestMethod: true