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

Posted

技术标签:

【中文标题】什么可以防止在服务器中覆盖 Access-Control-Allow-Origin?【英文标题】:What can prevent overriding Access-Control-Allow-Origin in server? 【发布时间】:2019-06-06 13:14:43 【问题描述】:

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

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

我找到了解决方案here和here,基本上都是介绍在注册函数中加入这个:

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? 如何“覆盖”或清除 Access-Control-Allow-Origin?

【问题讨论】:

***.com/questions/1653308/…你可以试试这个链接。 这可能会有所帮助 => crunchify.com/… 您和源站之间是否有 CDN 或代理服务器?另外,您是否阻止了OPTIONS?你需要它和 GET。 @adamrights 阻止选项?你能再解释一下吗? 【参考方案1】:

使用多个主机实现此目的的方法不止一种。一个是 .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 %AccessControlAllowOrigine 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");

【讨论】:

不幸的是,这并没有解决问题,但修改 .htaccess 让我更接近解决方案。我编辑了原始问题以反映我的发现。 这可能意味着您的 htaccess 不允许在您的其他服务器上覆盖更改 allowOverride None 为 allowOverride All 在 apache 的 httpd.conf 文件中让我知道它是否有效。或者您的 mod_headers 已启用。【参考方案2】:

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

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

核心 Apache 配置 .htaccess PHP

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

但是,如果您希望使用 .htaccess 文件实现此目的,请确保在 PHP 中没有对其进行任何修改,并确保在 &lt;VirtualHost&gt; 块中允许 AllowOverride。

【讨论】:

以上是关于什么可以防止在服务器中覆盖 Access-Control-Allow-Origin?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在 Python 中使用 FTPLIB 覆盖现有文件?

我可以防止 RestKit+CoreData 覆盖本地实体更改吗?

如何防止 TFS 覆盖标签?

是否可以防止 C 共享库中的函数覆盖?

如何覆盖 Response.Redirect 以防止端口随之而来

防止 Angular 6 路由器覆盖 Express Server 中定义的路由