【问题标题】:How can I set the Access-Control-Allow-Origin header?如何设置 Access-Control-Allow-Origin 标头?
【发布时间】:2021-05-25 06:59:23
【问题描述】:

我知道这是一个非常简单的问题,但是在搜索了很多之后我找不到如何设置标题。

这是我想做的:

每当用户访问https://www.google.com/ 时,扩展程序都应将其记录到日志文件中。我目前正在我自己的设备上开发扩展,并使用http://localhost/log.php 获取 POST 请求并根据发布的信息将信息记录到文件中。我的清单正在工作,我已经对其进行了测试。下面是我的track.js

function log(info){
    var xhttp=new XMLHttpRequest();
    xhttp.onreadystatechange=function(){
        if(this.readyState===4&&this.status===200){
            console.log(this.responseText);
        }
    }
    xhttp.open("POST","http://localhost/log.php",true);

    // xhttp.setRequestHeader("Access-Control-Allow-Origin","*");
    // above: my first attempt to set a header (did not work)

    xhttp.send("log_info="+info);
}
if(location.href==="https://www.google.com/")log("We're at google.com!");

这是我的log.php

<?php
header("Access-Control-Allow-Origin: *");
if(isset($_POST["log_item"]))
    file_put_contents("log.txt", $_POST["log_item"]."\n",FILE_APPEND);

log.txt 是一个空文件。我知道 CORS 是问题所在,因为当我在 https://www.google.com/ 上打开控制台时,我看到了这个:

Access to XMLHttpRequest at 'http://localhost/log.php' from origin 'https://www.google.com' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.

POST http://localhost/log.php net::ERR_FAILED

这对我来说似乎很简单,但我找不到如何设置标题。感谢您的帮助。

【问题讨论】:

  • 您提供的代码不会导致该错误。如果您取消注释上面的行“上面:我第一次尝试设置标头(没有工作)”,那么它会,但您不应该尝试在请求上放置响应标头。跨度>
  • 没有。 不要取消注释第一次尝试。 第一次尝试完全错误。您拥有的代码不会导致您所说的问题。问题是由您的第一次尝试引起的
  • @Quentin:哦,好的。那么如何修复它/如何设置请求标头?
  • 不要设置 request 标头。没有CORS请求头(Origin除外,浏览器会自动设置)
  • @Quentin:但是如果我注释掉 PHP try 和 JS try,那么我仍然会得到上面的错误。

标签: php xmlhttprequest


【解决方案1】:

您应该在您当前在本地主机上使用的网络服务器配置(Nginx 或 Apache 或...)中添加“Access-Control-Allow-Origin: *”。

您根本无法从您的代码或您的请求中绕过 CORS。

对于 nginx (/etc/nginx/nginx.conf):

https://enable-cors.org/server_nginx.html

阿帕奇:

https://enable-cors.org/server_apache.html

【讨论】:

  • “你应该在你的网络服务器配置中添加“Access-Control-Allow-Origin: *”——他们有。我们可以在问题中的PHP代码中看到。
  • 设置 Access-Control-Allow-Origin 不会解决这个问题,因为(除了已经设置)错误是:请求头字段 access-control-allow-origin is not allowed by Access-Control-Allow -标题
  • 首先,这正是我想要做的,但我不知道怎么做。其次,我正在尝试这样做,但它不起作用(代码在我的问题中)。
  • Allow-Origin 必须设置在网络服务器端,而不是在您的请求标头中。
  • @APB:感谢您的链接。对不起,我没有早点看到他们。我接受了您的回答,因为您的解决方案有效。 (另外,我确实绕过了 CORS,因为我的 PHP 中有 header,但这只是针对那个单个文件)。
猜你喜欢
  • 1970-01-01
  • 2016-07-21
  • 2018-01-24
  • 2016-01-11
  • 2019-09-10
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
相关资源
最近更新 更多