即使在设置 CORS 标头和服务器响应之后,Angular 和 laravel 的 CORS 问题[重复]

Posted

技术标签:

【中文标题】即使在设置 CORS 标头和服务器响应之后,Angular 和 laravel 的 CORS 问题[重复]【英文标题】:CORS problem with Angular and laravel even after setting the CORS header and server response [duplicate] 【发布时间】:2019-10-07 05:52:04 【问题描述】:

我是 Angular 新手,面临一些 CORS 问题。我尝试了所有可能的解决方案,包括设置 CORS 标头和服务器端更改。但还是不行。

我用 'Access-Control-Allow-Origin': '*' 标题更改了服务器端作为响应。我尝试使用邮递员,它工作正常并给出标题响应。我还在发送请求时在我的 Angular 应用程序中设置了标题。但仍然给出错误。 这是给予:

从源“http://localhost:4200”访问“http://skewcommerce.test/api/user/add/”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:不允许重定向预检请求。

这是我发送请求的服务。

import Injectable from '@angular/core';
import HttpClient from '@angular/common/http';
import HttpHeaders from '@angular/common/http';
import environment from '../../environments/environment';

@Injectable(
providedIn: 'root'
)

export class ApiService 
baseUrl = environment.APIUrl;
token: any;

constructor(private http: HttpClient) 



postData(url, data) 
const httpOptions =  new HttpHeaders(
        'Access-Control-Allow-Origin': '*',
        'Content-Type':  'application/json',
        );


return this.http.post(this.baseUrl + url + '/', data, headers : httpOptions);
   

请帮助我知道我做错了什么。 :(

【问题讨论】:

需要在服务器端设置,这里查看***.com/questions/56133333/… 我已经这样做了..我测试了 api,它给了我这些标题作为响应。 你能分享一张你的响应标题的图片吗? Access-Control-Allow-Origin →* Access-Control-Allow-Credentials →true Cache-Control →no-cache, private Access-Control-Allow-Methods →GET, POST, 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, responseType X -RateLimit-Limit →60 X-RateLimit-Remaining →59 您使用的是虚拟主机吗?还是一个域? 【参考方案1】:

由于您是 Angular 新手,我建议您寻求解决方案来设置代理配置。使用 angular-cli 绕过代理。这样一来,与 API server 对话的就是 Angular CLI server。

在项目文件夹中创建代理配置文件:proxy.config.json,内容如下。


 "/api/*": 
    "target": "http://skewcommerce.test/api",
    "secure": false,
    "pathRewrite": "^/api" : ""
  

现在您可以使用以下命令为您的应用提供服务:

ng serve  —-proxy-config proxy.conf.json

请注意,您的请求必须转到“localhost:4200/app/resource name”。例如,像这样:

this.httpClient.get('api/data/users'));

【讨论】:

【参考方案2】:

确保在您的虚拟主机配置中设置了标头。

虚拟主机应该这样配置。

<VirtualHost *:80>

  # CORS
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header always set Access-Control-Allow-Credentials "true"
    Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
    Header always set Access-Control-Max-Age "1000"

    # Added a rewrite to respond with a 200 SUCCESS on every OPTIONS request.
    RewriteEngine On
    RewriteCond %REQUEST_METHOD OPTIONS
    RewriteRule ^(.*)$ $1 [R=200,L]

    ServerName skewcommerce.test

    DocumentRoot /Your/Dir/To/The/Site
    <Directory  "/Your/Dir/To/The/Site">
        Options +Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>

如果你这样做,你可能需要删除 Laravel 端的'Access-Control-Allow-Origin': '*'

希望对你有帮助。

【讨论】:

以上是关于即使在设置 CORS 标头和服务器响应之后,Angular 和 laravel 的 CORS 问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

CORS - 即使在成功的 OPTIONS 响应之后,Firefox 也不会发送 API 调用

响应标头中的 Azure 无服务器功能启用 CORS

使用带有模式的 fetch API:'no-cors',无法设置请求标头

在 Angular 6 中将 CORS 标头添加到响应中

即使 CORS 不允许标头值,Angularjs 也会继续进行服务器调用

如何将 CORS 标头设置为内部服务器错误响应?