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

时间:2019-01-11 15:31:23

标签: php wordpress cors

我有一个带有API的WP站点,并且与其他站点一起调用它。我收到此错误

  

在www.wpsiteurl.com上访问XMLHttpRequest   来源(www.theothersiteurl.com)已被CORS封锁   策略:对预检请求的响应未通过访问控制   检查:“ Access-Control-Allow-Origin”标头包含多个   值为“ www.theothersiteurl.com,*”,但只能使用一个。

我找到了解决方法herehere,基本上将其添加到了寄存器函数中:

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文件。这在我正在测试该解决方案的其他环境中起作用。但是,在其他服务器上却没有-将原点添加到原点字符串中,就像使用php添加原点一样。

在我看来,有些东西无法完全覆盖access-control-allow-origin并强制添加到其中。

我的问题是:

  • 是什么导致服务器不允许设置一个Access-Control-Allow-Origin?
  • 如何“替代”或清除“访问控制允许来源”?

2 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:1)

  

“ Access-Control-Allow-Origin”标头包含多个值“ www.theothersiteurl.com,*”,但仅允许一个。

您必须非常小心,仅将此标题设置为一点。这可以在3个地方完成:

  • 核心Apache配置
  • .htaccess
  • PHP

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

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