什么可以阻止覆盖服务器中的访问控制允许来源



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

访问www.wpsiteurl.com上的XMLHttpRequest来源www.theothersiteurl.com已被CORS屏蔽策略:对飞行前请求的响应未通过访问控制check:"Access Control Allow Origin"标头包含多个值为"www.theothersiteurl.com,*",但只允许使用一个。

我在这里找到了解决方案,基本上是将其添加到寄存器函数中:

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;
});

对我来说,这不起作用,因为它只是返回*或任何添加为原点和另一个*的内容。更改第二个参数没有帮助,在添加此操作后,似乎在原点中添加了通配符。

我按照答案中的建议编辑了.htaccess文件。这在我测试解决方案的其他环境中也起到了作用。然而,在另一台服务器上却没有——origin被添加到origin字符串中,就像它是用php添加的一样。

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

我的问题是:

  • 是什么原因导致服务器不允许设置一个访问控制允许原点
  • 如何"覆盖"或清除访问控制允许原点

有多种方法可以通过多个主机实现这一点。一个是.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>

使用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");
}

"Access Control Allow Origin"标头包含多个值"www.theothersiteurl.com,*",但只允许一个值。

您必须非常小心,只在一点上设置此标头。这可以在3个地方完成:

  • 核心Apache配置
  • .htaccess
  • PHP

出于性能和安全原因,我建议在Apache核心配置中执行此操作。

但是,如果您希望使用.htaccess文件来实现这一点,请确保在PHP中没有任何修改,并确保在<VirtualHost>块中允许AllowOverride。

相关内容

最新更新