【问题标题】:CORS Issue - Angular / PHP / ApacheCORS 问题 - Angular / PHP / Apache
【发布时间】:2019-02-18 04:37:45
【问题描述】:

我认为互联网上到处都有类似的主题,但我只是花了 1 小时搜索,仍然无法解决这个问题。

我无法使用 Angular 在我的服务器(Apache 和 PHP)上使用 POST 发出请求。

我在节点 10、apache 2.4 和 php 7.1 中使用 angular/cli v.6.2.1

这是来自 Http 调用的简单代码(HttpClient 和 HttpHeaders 都来自 @angular/common/http):

constructor(private http: HttpClient){}

this.http.post('http://localhost/distributor.php', ['prop1':'value1', 'prop2':'value2'], {headers: new HttpHeaders().set('Access-Control-Allow-Origin','*')}).subscribe(
data => {
    console.log(data);
},
err => {
    console.log('error');
});

}

我只是尝试通过这种方式从 PHP 发送回一些东西:

<?php
    $data = $_POST;
    echo json_encode($data);

我已经允许 apache 配置文件中的所有来源。 在“OPTIONS”预检之后,Firefox 和 Chrome 都让我失望了,不做任何其他事情,PHP 文件没有返回。

这是 FireFox 向我展示的内容:

我可以在网络标签中看到这个:

响应选项卡显示一个完全空的框。

我可以从我的 http.post 中删除自定义标头的部分,它不会改变任何内容。

让我觉得奇怪的是,我可以单击 FireFox 编辑和重新发送按钮,而无需更改任何内容,并且出现了正确的结果...

感谢阅读/帮助

【问题讨论】:

  • 您需要在 PHP 代码中调用 header("Access-Control-Allow-Origin: *);,而不是在客户端。否则任何人都可以轻松地完全绕过 CORS。
  • 它没有任何改变。我已经按照您在我的 PHP 文件顶部提到的方式将它放在了我的 PHP 文件顶部,并且没有任何变化。顺便说一句,正如您在“响应标头”部分中看到的那样,“Access-Control-Allow-Origin”设置为 *...
  • @Julo0sS 也请出示您的 php 代码
  • 另外,检查控制台是否有错误信息

标签: javascript php angular cors xmlhttprequest


【解决方案1】:

首先你需要修复你的 POST 数据;您在 Object 语法周围有方括号。

const data = { 'prop1': 'value1', 'prop2': 'value2' };
this.http.post('http://localhost/distributor.php', data).subscribe(
  reply => {
    console.log(reply);
  },
  err => {
    console.log('error', err);
  });

接下来,您需要添加适当的标头并设置 PHP 以处理 JSON:

<?php
header('Access-Control-Allow-Headers: Access-Control-Allow-Origin, Content-Type');
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json, charset=utf-8');

// grab JSON data sent by Angular
$data = json_decode(file_get_contents('php://input'), true);
// add numeric data
$data["prop3"] = 3;
// reply
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);

这对我有用。

【讨论】:

  • 确实如此。头球没问题,这边没有问题。唯一的问题来自我发送的对象周围的括号。一旦解决了这个问题,请求就会神奇地变成 POST 而不是 OPTIONS,一切都很好。感谢您的帮助
  • 现在是凌晨 1:30,我正在申请一份我真正需要的工作,因此我被困了 1 个小时。谢谢你,谢谢你,我对你的所有感激之情
【解决方案2】:

我遇到了同样的问题,但通过将这些行添加到您的 php 代码中解决了

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Content-Type: application/json');

let data = {
            'prop1': 'value1',
            'prop2': 'value2'
        };
        return this.http.post('http://localhost/distributor.php', data, {headers: new HttpHeaders().set('Access-Control-Allow-Origin', '*')}).map((response: Response) => {
            let data = response;
            if (data) {
                console.log(data);
            }
        })

【讨论】:

  • 同样的问题。将您的标头复制/粘贴到我的 PHP 中,但仍然没有响应。
猜你喜欢
  • 2021-09-19
  • 2016-12-15
  • 2015-04-17
  • 2019-12-01
  • 2020-07-21
  • 2017-06-20
  • 2019-02-05
  • 2015-08-23
  • 2020-06-21
相关资源
最近更新 更多