关于请求方法 “OPTIONS” 的路由处理行为,有些疑惑不解

关于请求方法 “OPTIONS” 的路由处理行为,有些疑惑不解
关于 OPTIONS 请求方法,我的理解是一般遇到特殊请求方法(比如 PUT 请求方法)浏览器会自动发送 OPTIONS 请求方法询问服务器都支持什么请求方法。服务器告诉浏览器,我支持 GETPOSTPUT 等方法(上图的中的 Access-Control-Allow-Methods 字段)。

上图的 Access-Control-Allow-Methods 响应头是我自己加的,
Larave 框架添加的响应头是下面的 Allow 字段,
处理位置在 Laravel6 Illuminate/Routing/RouteCollection.php 文件 236 - 240

    protected function getRouteForMethods($request, array $methods)
    {
        if ($request->method() === 'OPTIONS') {
            return (new Route('OPTIONS', $request->path(), function () use ($methods) {
                return new Response('', 200, ['Allow' => implode(',', $methods)]);
            }))->bind($request);
        }

        $this->methodNotAllowed($methods, $request->method());
    }

我比较疑惑的地方是,Laravel 框架为什么用 Allow 而不是直接用 Access-Control-Allow-Methods,这样我就不用自己添加 Access-Control-Allow-Methods 了(浏览器貌似只认 Access-Control-Allow-Methods 字段, Allow 字段并没有什么作用)


一直做接口开发,总觉得要自己添加响应头很不 优雅,觉得既然框架已经在 Allow 中返回了允许的请求方法,为什么不能直接在 Access-Control-Allow-Methods 中返回呢,我忽略了这是一个跨域问题,的确是需要自己手动处理的,现在没有疑问了

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
leo
最佳答案

Access-Control-Allow-Methods 是给 CORS 用的,Laravel 并不知道你的这个路由是否真的要允许 CORS。

从语义上来说,Option 请求就是询问服务器这个接口支持哪些 method,Laravel 通过 Allow 头返回信息。developer.mozilla.org/zh-CN/docs/W...

4年前 评论
seaChild 4年前
Sunman (楼主) 4年前
讨论数量: 2
seaChild

file

4年前 评论
seaChild (作者) 4年前
小李世界 4年前
seaChild (作者) 4年前
seaChild (作者) 4年前
seaChild (作者) 4年前
leo

Access-Control-Allow-Methods 是给 CORS 用的,Laravel 并不知道你的这个路由是否真的要允许 CORS。

从语义上来说,Option 请求就是询问服务器这个接口支持哪些 method,Laravel 通过 Allow 头返回信息。developer.mozilla.org/zh-CN/docs/W...

4年前 评论
seaChild 4年前
Sunman (楼主) 4年前