在ionic 4上使用Angular 7 post时发生cors策略错误 - php

我心烦张贴类似的问题,但花费超过3天,没能解决这个问题。

平台:Ionic 4 Angular 7

当我尝试发布时,我出现了cors策略错误。

从源'https://mersinders.com/api/service.php?run=giris'在'http://localhost:8100'处对XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。

当我禁用Chrome安全性时,一切正常。

“ C:\ Program Files(x86)\ Google \ Chrome \ Application \ chrome.exe”
--disable-web-security --disable-gpu --user-data-dir =〜/ chromeTemp

HttpErrorResponse {header:HttpHeaders,status:400,statusText:“ Bad Request”,url:“ https://mersinders.com/api/service.php?run=giris”,ok:false,...}

在Php api端使用以下标头后,问题开始。

header('Status:400',TRUE,400); header('Status:404',TRUE,404);

我有config.ini.php,其中包括数据库信息和连接,以及service.php,其切换情况为“ service.php?run = XXXXX”。

当我在service.php中设置标题时

header('Access-Control-Allow-Origin:*');
header(“ Access-Control-Allow-Credentials:true”);
header('Access-Control-Allow-Methods:GET,PUT,POST,DELETE,
选项”); header('Access-Control-Max-Age:1000');
header('Access-Control-Allow-Headers:Content-Type,Content-Range,
内容处置,内容描述');

include('config.ini.php');

我得到以下错误。

在以下位置访问XMLHttpRequest
来源的“ https://mersinders.com/api/service.php?run=giris”
“ http://localhost:8100”已被CORS政策阻止:对
预检请求未通过访问控制检查:否
请求中存在“ Access-Control-Allow-Origin”标头
资源。

当我在.htaccess中设置标题时

标题始终设置为Access-Control-Allow-Origin“ *”标题始终设置为
Access-Control-Allow-Methods“ POST,GET,HEAD”总是设置标题
访问控制最大年龄“ 1000”

我得到以下错误。

在以下位置访问XMLHttpRequest
来源的“ https://mersinders.com/api/service.php?run=giris”
“ http://localhost:8100”已被CORS政策阻止:对
预检请求未通过访问控制检查:它没有
HTTP正常状态。

但是,在禁用安全的Chrome和邮递员上,一切正常。
我也尝试过

proxy.config.json

{
    "/api/*": {
        "target": "https://mersinders.com",
        "secure": false,
        "logLevel": "debug"

    }
}

和ionic.config.json

{
    "name": "mersinders",
    "integrations": {
        "cordova": {}
    },
    "type": "angular",
    "proxies": [{
        "path": "/api/*",
        "proxyUrl": "https://mersinders.com"
    }]
}

和tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": []
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ],
  "proxies": [
    {
      "path": "/api/*",
      "proxyUrl": "https://mersinders.com"
    }
  ]
}

我的帖子功能

 var headers = new HttpHeaders();
    headers.append("Accept", 'application/json');
    headers.append('Content-Type', 'application/json');
    headers.append('Access-Control-Allow-Origin', '*');

    let postData = {
      "username": this.userData.username,
      "password": this.userData.password,
      "clientIp": this.cekIp(),

    }
    console.log(postData);
    this.http.post(environment.SERVER_URL + "service.php?run=giris", postData,{ headers:headers, observe: 'response' })
      .subscribe(response => {
        if (response.status == 200 && response.body[0].ogretmen_token != "") {
          this.isUser.token = response.body[0].ogretmen_token;
          en_isUser.Loggedin = true;
          en_isUser.token = this.isUser.token;
          en_isUser.guid = this.isUser.guid;
          this.status.girisCode = response.status;
          //   this.storage.set('token',this.isUser.token);
          window.localStorage.setItem('token', this.isUser.token);
          this.router.navigate(['/tabs/anasayfa']);
        }
        console.log(this.isUser.token);
      }, error => {
        this.status.girisCode = error.status;
        this.isUpdated = error.error;
        console.log(error);
      });

问题1)我们如何解决cors政策错误。以及为什么我的标头仅在.htaccess中起作用。

用ionic 4本机http发布工作,但我想使用Angular 7 Http。感谢您的建议。

编辑:当我检查服务器中的日志时,我看到了;
AH01623:服务器配置拒绝客户端方法:“ OPTIONS”,

然后我用邮递员检查是否有问题。我看到,当我从chrome发布数据时,在邮递员中似乎是“ POST”,但在服务器上是OPTIONS并被阻止。

Edit1:经过更多尝试,我发现https://cors-anywhere.herokuapp.com/将OPTIONS请求转换为POST请求,这就是为什么它可以在chrome上运行的原因。

我试图通过邮递员提出OPTIONS请求,但失败了(405不允许)。但是邮递员成功发布了POST请求。看来后端有问题。有人可以帮忙为什么标头可以在htaccess中工作,而不能在service.php文件中工作(可能吗?:选项方法可以到达.htaccess,然后该服务器删除该请求?)。

参考方案

我花了3天多的时间来解决cors问题,终于解决了。问题是httpd conf文件中不允许使用OPTIONS。我遵循以下步骤。

在这段时间内我面临着。

错误1),这表示您没有添加标题(“ Access-Control-Allow-Origin:*”);到service.php文件

在以下位置访问XMLHttpRequest
来源的“ https://mersinders.com/api/service.php?run=giris”
'http://localhost:8100'已被CORS政策阻止:否
请求中存在“ Access-Control-Allow-Origin”标头
资源。

错误2)的意思是“您发布了一些内容,但在发布之前,如果服务器未返回我们的状态,我们要检查安全性:200,我们将不会发布您的请求”。

在以下位置访问XMLHttpRequest
来源的“ https://mersinders.com/api/service.php?run=giris”
“ http://localhost:8100”已被CORS政策阻止:对
预检请求未通过访问控制检查:它没有
HTTP正常状态。

终于我有下面的标头为service.php

if (isset($_SERVER['HTTP_ORIGIN'])) {

    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        // may also be using PUT, PATCH, HEAD etc
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
}

发布功能

send(){
 var headers = new HttpHeaders();
    headers.append("Accept", 'application/json');
    headers.append('Content-Type', 'application/json');
    headers.append('Access-Control-Allow-Origin', '*');

    let postData = {
      "username": this.userData.username,
      "password": this.userData.password,
      "clientIp": this.cekIp(),

    }
    console.log(postData);
    this.http.post(environment.SERVER_URL + "service.php?run=giris", postData,{ headers:headers, observe: 'response' })
      .subscribe(response => {
        console.log(response);
      }, error => {

        console.log(error);
      });

}

htaccess中没有任何内容。

当您尝试解决此问题时,请遵循服务器日志。我想为没有花很多时间的人解释一下。

如何从php中获取datatables jQuery插件的json数据 - php

我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…

PHP:将数组值加在一起 - php

我相信这比标题听起来要难一些,但我可能完全错了。我有一个像这样的数组:[["londrina",15],["cascavel",34],["londrina",23],['tiradentes',34],['tiradentes',21]] 我希望能够采用通用…

PHP JQuery复选框 - php

我有以下片段。 var myData = { video: $("input[name='video[]']:checked").serialize(), sinopse: $("#sinopse").val(), dia: $("#dia").val(), quem: $(&#…

PHP-正则表达式删除引号并添加大括号? - php

好吧,我不愿承认这一点,但是我对REGEX感到很困难,我永远找不到关于如何设置表达式的不错的教程。所以说我有这样的事情context['something'] 我想将所有事件更改为context[something] 那我有' . $var . ' 我想将所有事件更改为{var} 这是当前的概念,但是我在正则表达式部分…

PHP:将元素ID作为哈希添加到Facebook共享链接 - php

在this page上,我有一堆显示为精美框的mp3文件。每个框都有一个Facebook分享按钮。我想将每个框ID((mp3jWrap_0, mp3jWrap_1等)作为哈希添加到其Facebook共享链接,以便每次从Facebook访问共享项目时,URL都包含该项目的哈希。为此,我编写了代码:<?php $actual_link = (isset($…