首页 > 解决方案 > 为什么 Safari 在重定向时发送 Origin 标头?

问题描述

我正在使用 JSF2.2 开发一个 Web 应用程序,并使用受保护的视图进行 CSRF 保护。
我使用 Nginx 作为反向代理服务器。

我面临的问题是,当我作为对 POST 请求(PRG)的响应的重定向结果执行 GET 请求时,会发生以下错误。
当我使用 Chrome、Firefox 或 Edge 时,不会发生这种情况。

2020-03-02 16:30:33,623 SEVERE [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-377) JSF1100: Origin [sic] header value https://example.com does not appear to be a protected view. Preventing display of viewId /some/protected/view.xhtml
2020-03-02 16:30:33,624 ERROR [my.project.commons.exception.logger.ExceptionLogFormatterImpl] (default task-377) SessionId=ZH1NL8D53vR6FLfG5hj4v3fNp3OVCByXBrzZJtGy RequestId=WNsDVWCm ContractNo=64811790 CSRFトークンエラー: javax.faces.application.ProtectedViewException: JSF1100: Origin [sic] header value https://example.com does not appear to be a protected view. Preventing display of viewId /some/protected/view.xhtml

这是因为:

所以问题是,为什么 Safari 在重定向时发送 Origin 标头?
查看规范,如果不是 CORS 请求,则不会在 GET 请求上设置 Origin 标头,实际上,Safari 不会在常规 GET 请求(不是重定向)上发送 Origin。

或者,这与反向代理有关吗?它是否可能使内部重定向类似于 CORS 请求?

这可以通过 Mac OS X 10.10.5 上的 Safari 10.1.2 和 iPad 上的 Safari 12.1.1重现,而 Mac OS X 10.15.2 上的 Safari 13.0.4 则 无法重现

标签: nginxjsfsafarireverse-proxy

解决方案


推荐阅读