问题描述

我已经看到 wp_headerssend_headers 都用于同样的事情,我想知道你是如何想知道使用哪一个,何时…

send_headers codex 页面上有一个例子,为 Internet Explorer 向后兼容添加 X-UA-Compatible: IE=edge,chrome=1,因为元标记通常是 fails on intranet sites if loaded too late

这就是 send_headers 的例子:

add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
    header( 'X-UA-Compatible: IE=edge,chrome=1' );
}

不过 wp_headers 也可以这样做:

apply_filters ( 'wp_headers', array $headers, WP $this )

add_filter( 'wp_headers', 'wpieeam_headers' );
function wpieeam_headers($headers) {
    if (!is_admin()) {
        $headers['X-UA-Compatible'] = 'IE=edge,chrome=1';
    }
    return $headers;
}

更新:我实际上刚刚注意到,a conversation on this 或多或少在几年前就类似的问题开始了…

另外,send_headers 只与前端有关吗?我看过 wp_headers 做这样的检查:

if ( isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) )

if (!is_admin())

所以我在想,也许 send_headers 不必做这些检查…

最佳解决方案

好吧,我想我想出来了

这两个工作大部分是通过将 http /php 标头发送到浏览器来预期的。 wp_headers 实际上是 send_headers()功能中的一个过滤器。您可以使用它来修改标题,然后将其发送到浏览器,但有一些例外。 wp_headers 将无法做任何事情,如果它是一个静态缓存页面处理…

这是 send_headers 钩子发挥作用的地方。在 wp_headers 过滤器之后,send_headers()功能检查是否已经发送 Last-Modified,会告诉我们页面是否被缓存,然后在缓存,内容类型等已经发送之后让我们挂接它。

所以对于我使用 X-UA-Compatible 的例子,当它们都工作时,我倾向于使用 send_headers 。为什么?对于一个如果你要添加这两个,send_headers 将赢得每一次,并将确保它是加载,即使添加页面缓存后。

使用<meta> 标签 (如 many popular frameworks use) 也适用于 x-ua-compatible,但在许多浏览器中不起作用,除非在打开头标签后立即加载。这是由于各种原因,如“intranet” setting is set network wide 。因此使用 php 方法更安全。但是,如果要添加两者,则元标记将获胜 (假设包含足够早。

关于 X-UA-Compatible 兼容,我希望这将是无关紧要的,因为 Microsoft is dropping support 为旧版本的 IE 下周!


此外,我没有使用 is_admin()检查 wp_headers 筛选器,并且不会修改 admin_headers,因此不必进行检查。

如果您因为某些原因确实需要修改管理员标题,我知道您可以这样做,但我不确定是否会一直运行…

function admin_add_my_header() {
    header('X-UA-Compatible: IE=edge,chrome=1');
}
add_action( 'admin_init', 'admin_add_my_header', 1 );

根据 Toscho 的建议更新答案,以检查管理员:

is_admin() || add_action('send_headers', function(){
    header('X-UA-Compatible: IE=edge,chrome=1');
}, 1);

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。