Php 了解访问控制允许源和缓存

Php 了解访问控制允许源和缓存,php,wordpress,caching,http-headers,cors,Php,Wordpress,Caching,Http Headers,Cors,在查询WordPress API时,我对我认为是缓存源报头的内容有一个问题。然而,我正在努力弄清楚到底发生了什么,以及如何修复它 首先,下面是发生的情况: 我有一个HubSpot页面,可以通过ajax查询WordPress API,特别是WP API菜单插件添加的端点-然后我构建菜单,这样当客户端(或营销团队之一)在WordPress中更新菜单时,菜单也会在HubSpot页面上更新 HubSpot页面位于WordPress站点的子域上,最初WordPress站点添加了标题访问控制允许源代码,并明

在查询WordPress API时,我对我认为是缓存源报头的内容有一个问题。然而,我正在努力弄清楚到底发生了什么,以及如何修复它

首先,下面是发生的情况:

我有一个HubSpot页面,可以通过ajax查询WordPress API,特别是WP API菜单插件添加的端点-然后我构建菜单,这样当客户端(或营销团队之一)在WordPress中更新菜单时,菜单也会在HubSpot页面上更新

HubSpot页面位于WordPress站点的子域上,最初WordPress站点添加了标题访问控制允许源代码,并明确设置了子域URL

如果我浏览到HubSpot内的编辑屏幕-主菜单不会加载,但第二次调用(对于不同的菜单)成功。主菜单的错误如下所示:

add_filter( 'allowed_http_origins', 'my_add_origins' );
function my_add_origins($origins) {
    $origins[] = 'https://preview.hs-sites.com';
    $origins[] = 'http://subdomain.example.com';
    return $origins;
}
“Access Control Allow Origin”标头具有一个值 “”不等于提供的值 起源。因此,不允许使用源“” 进入

是活动页面的URL。奇怪的是,预览页面的实际URL不是-但我认为这可能是因为预览加载在iframe中

现在,当我转到live URL时,同样的事情发生了——第一次调用错误,但第二次成功。这一次的错误如下:

add_filter( 'allowed_http_origins', 'my_add_origins' );
function my_add_origins($origins) {
    $origins[] = 'https://preview.hs-sites.com';
    $origins[] = 'http://subdomain.example.com';
    return $origins;
}
“Access Control Allow Origin”标头具有一个值 “”不等于提供的值 起源。因此,不允许使用源“” 进入


问题1-这是因为源代码已被 WordPress网站

我现在已经在WordPress中的允许的\u http\u来源过滤器中添加了和,如下所示:

add_filter( 'allowed_http_origins', 'my_add_origins' );
function my_add_origins($origins) {
    $origins[] = 'https://preview.hs-sites.com';
    $origins[] = 'http://subdomain.example.com';
    return $origins;
}
问题2:不考虑假定的缓存-为什么是 如果已添加到,则不可接受 允许的来源

我不确定如何测试上述功能,因此我也尝试了以下方法:

add_action( 'rest_api_init', function() {
    remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');
    add_filter('rest_pre_serve_request', function($value) {
        $domains = [
            'https://preview.hs-sites.com',
            'http://subdomain.example.com'
        ];
        $allowed = get_http_origin();
        if ($allowed && (in_array($allowed, $domains))) {
            header("Access-Control-Allow-Origin:" . esc_url_raw($allowed));
        } elseif (!$allowed) {
            header("Access-Control-Allow-Origin: http://subdomain.example.com");
        }
        header('Access-Control-Allow-Methods: GET');

        return $value;
    });
});
但同样的错误也会发生

问题3:有人能解释一下发生的过程吗 在这种情况下,错误在说什么——具体在哪里 他们从中获取值-origin是当前页面吗?及 “Access Control Allow Origin”标头有一个值“…-这 值由已设置为 访问控制允许WordPress中的原始标题-正确吗

注意我也尝试过在ajax请求中设置无缓存头,但这是由于飞行前请求导致的错误。我还向请求中添加了一个随机查询字符串,但没有效果


出于安全原因,我希望避免在Access Control Allow Origin标头中添加通配符值。我真的很想知道发生了什么

尝试在服务器响应中添加一个值为
Origin
Vary
响应头

Origin
请求头的值与它缓存的请求的
Origin
值不同时,这会导致任何浏览器跳过缓存并发出新的网络请求

有关更多信息,请参阅

Vary
HTTP响应头确定如何匹配未来的请求 决定是否可以使用缓存响应而不是 正在从源服务器请求一个新的。它被用户使用 服务器,以指示在选择邮件时使用的邮件头 在内容协商算法中表示资源