【问题标题】:CORS: Content-Type is not allowed by Access-Control-Allow-Headers in preflight responseCORS:在预检响应中 Access-Control-Allow-Headers 不允许 Content-Type
【发布时间】:2017-02-19 03:28:02
【问题描述】:

我正在使用 vuejs 和 lumen 为 api 构建一个应用程序,

我的 vuejs 应用在尝试进行身份验证时抛出错误

XMLHttpRequest 无法加载 http://api.dev/auth/login。预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Content-Type。

我有一些中间件来处理 cors

class cors {

    /**
     * @var array
     */
     protected $settings = [
      'maxAge'            => 0,
      'origin'            => '*',
      'allowMethods'      => '*',
      'exposeHeaders'     => '*',
      'allowedHeaders'    => '*'
     ];

public function handle(ServerRequestInterface $request, Closure $next)
{
   //handle preflight request
    if ('OPTIONS' == $request->getMethod()) {
        $response =  new \Illuminate\Http\Response('',"204");
        $this->setOrigin($request, $response);
        $this->setAllowHeaders($request,$response);
        return $response;
    }
}

/**
 * @param ServerRequestInterface $request
 * @param ResponseInterface $response
 */
protected function setOrigin(ServerRequestInterface $request,$response)
{
    $origin = $this->settings['origin'];
    if (is_callable($origin)) {
        $origin = call_user_func($origin,$response->withAddedHeader('Origin',$origin));
    }
    $response->headers->set('Access-Control-Allow-Origin', $origin);
}

/**
 * @param ServerRequestInterface $request
 * @param ResponseInterface $response
 */
protected function setAllowHeaders(ServerRequestInterface $request,$response)
{
    if (isset($this->settings['allowedHeaders'])) {
        $allowedHeaders = $this->settings['allowedHeaders'];
        if (is_array($allowedHeaders)) {
            $allowedHeaders = implode(", ", $allowedHeaders);
        }
    }
    else { 
        $allowedHeaders = $request->hasHeader("Access-Control-Request-Headers");
    }

    if (isset($allowedHeaders)) {
        $response->headers->set('Access-Control-Allow-Headers', $allowedHeaders);
    }
}
}

在 chrome 中显示我的响应标题

Access-Control-Allow-Headers:*
Access-Control-Allow-Origin:*
Cache-Control:no-cache
Content-Type:text/html; charset=UTF-8
Date:Mon, 10 Oct 2016 16:10:52 GMT
Server:Caddy
Status:204 No Content
X-Powered-By:PHP/7.0.10

如果我设置了通配符 Access-Control-Allow-Headers 为什么它不接受标头?

【问题讨论】:

    标签: javascript php cors vue.js lumen


    【解决方案1】:

    根据answer to this questionAccess-Control-Allow-Headers 的通配符是相对较新的(2016 年 5 月),因此它可能没有被大多数浏览器广泛采用。

    您可能应该准确定义要在预检请求中允许的标头。

    【讨论】:

    • 我使用最新的 chrome 浏览器并查看其他 cors 实现,它们似乎都使用通配符
    • 我相信您看到的错误消息是来自浏览器,所以可以肯定的是浏览器可能不支持它。为什么不将通配符更改为Content-Type 看看会发生什么?
    • 如果我将设置数组允许的标头更改为 'allowedHeaders' => 'Content-Type,Authorization,Origin',我的错误消息将返回 XMLHttpRequest cannot load api.dev//auth/login。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头,这似乎是后退一步
    • 所以您的 OPTIONS 请求同时返回了 Access-Control-Allow-HeadersAccess-Control-Allow-Origin 并且您收到了关于缺少 Access-Control-Allow-Origin 的消息?
    猜你喜欢
    • 2020-09-28
    • 2011-06-29
    • 2019-03-17
    • 2016-05-15
    • 2017-08-15
    • 2020-02-27
    • 2019-02-10
    • 2019-09-09
    相关资源
    最近更新 更多