什么可以防止覆盖服务器中的 Access-Control-Allow-Origin?

Jaa*_*rhu 5 php wordpress cors

我有一个带有 API 的 WP 站点,我正在使用其他站点调用它。我收到这个错误

从源 www.theothersiteurl.com 访问 www.wpsiteurl.com 上的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:'Access-Control-Allow-Origin' 标头包含多个值' www.theothersiteurl.com, *',但只允许一个。

我在这里这里找到了解决方案,基本上介绍了将其添加到 register 函数中:

remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
add_action( 'rest_pre_serve_request', function ($value) {
    $origin = get_http_origin();
    header( 'Access-Control-Allow-Headers: X-Requested-With' );
    header( 'Access-Control-Allow-Methods: POST, GET' );
    header( 'Access-Control-Allow-Origin: *');
    header( 'Access-Control-Allow-Credentials: true');
    return $value;
});
Run Code Online (Sandbox Code Playgroud)

对我来说这不起作用,因为它只是返回 * 或任何添加为原点和另一个 *. 更改第二个参数无济于事,似乎在添加此操作后向原点添加了通配符。

我按照答案中的建议编辑了 .htaccess 文件。这适用于我正在测试解决方案的其他环境。然而,在其他服务器上它没有 - 原点被添加到原点字符串中,就像它是用 php.ini 添加的一样。

对我来说,似乎有一些东西阻止了完全覆盖访问控制允许来源和添加到它的力量。

我的问题是:

  • 什么会导致服务器不允许设置一个 Access-Control-Allow-Origin?
  • 如何“覆盖”或清除 Access-Control-Allow-Origin?

小智 4

有不止一种方法可以通过多个主机实现此目的。一种是使用 .htaccess,另一种是使用 php。

使用 .htaccess:

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.example|dev02.otherdomain.example)$" AccessControlAllowOrigin=$0
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header merge Vary Origin
</IfModule>
Run Code Online (Sandbox Code Playgroud)

使用 PHP:

$origin = $_SERVER['HTTP_ORIGIN'];

if ($origin == "http://www.domain1.com"
        || $origin == "http://www.domain2.com"
        || $origin == "http://www.domain3.com") {
    header("Access-Control-Allow-Origin: $origin");
}
Run Code Online (Sandbox Code Playgroud)