问题描述
我已经看到 wp_headers
和 send_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。