代码之家  ›  专栏  ›  技术社区  ›  Ricky

角形和大型CORS访问控制允许源站问题

  •  0
  • Ricky  · 技术社区  · 6 年前

    在过去的几个月里,我一直在开发人员的机器上本地编写Angular(客户机)和Laravel(API)应用程序,没有出现任何问题。几天前,我将应用程序(客户机和API)上载到服务器,突然间我开始出现CORS错误:

    访问位于' https://api.domain.pt/api/login 从 起源 https://client.domain.pt '已被CORS阻止 策略:对飞行前请求的响应未通过访问控制 检查:没有“访问控制允许来源”标题出现在 请求的资源。

    在开发的开始,我还得到了这些错误,因为我为客户机和API(client.localhost和api.localhost)使用了不同的本地域,并最终解决了在Laravel API中添加CORS中间件的问题:

    public function handle($request, Closure $next)
    {
        //apply cors only to api routes
        if (Request::segment(1) == 'api') {
    
            header("Access-Control-Allow-Origin: *"); 
    
            $headers = [
                'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
                'Access-Control-Allow-Headers' => 'X-Requested-With, X-Auth-Token, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding, X-Login-Origin',
                'Access-Control-Allow-Credentials' => 'true'
            ];
    
            if ($request->isMethod("OPTIONS")) {
                // The client-side application can set only headers allowed in Access-Control-Allow-Headers
                return Response::make('OK', 200, $headers);
            }
    
            $response = $next($request);
    
            foreach ($headers as $key => $value) {
                $response->header($key, $value);
            }
        } else {
            $response = $next($request);
        }
    
        return $response;
    }
    

    所有路由都使用CORS中间件。当应用程序试图发布到登录API(/api/login)时,它甚至没有进入CORS中间件。

    为什么这在本地工作而不是在服务器中?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Therichpost    6 年前

    请按照以下帮助和参考链接获取帮助:

    您可以检查CORS中间件的Laravel包或以下链接:

    Angular and Laravel CORS Access-Control-Allow-Origin Issues

        2
  •  0
  •   Ricky    6 年前

    我已经设法解决了我的问题。由于没有调用我的自定义CORS中间件,我将自定义头添加到web.config文件中:

    <configuration>
      <system.webServer>        
        <!-- SOLVES CORS ISSUES -->
        <httpProtocol>
         <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="X-Requested-With, X-Auth-Token, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding, X-Login-Origin" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
         </customHeaders>
       </httpProtocol>
       <!-- /SOLVES CORS ISSUES -->
      </system.webServer>
    </configuration>
    

    这是最合适的解决方案,但现在我要使用它。 如果任何人有任何其他解决方案,而不是强制自定义头,请回复。

    更新:

    Apache的临时解决方案。将此添加到.htaccess文件:

    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Headers "X-Requested-With, X-Auth-Token, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding, X-Login-Origin, responseType"
    Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"