所有WP页面上都有两个正文标签,无论主题如何

时间:2015-08-13 作者:Tofuwarrior

我有个棘手的问题。如果我使用chrome element inspector检查WP页面,我会看到两个正文标记:

<body cz-shortcut-listen="true">
    <body>
这一点与firebug中的colorzilla(cz shortcut listen=“true”)有关,它会消失。您只有两个没有类的body标记。

问题不在于来自colorzilla的cz快捷方式listen=“true”位。这是关于额外的标签。

这种重复会导致样式和JS问题。如果我查看源代码,那么只有一个

<body> 
显示时没有类。

这两个视图中都没有显示body\\u class()中的类,但当它们不在标题中的这一行时,我可以很高兴地将它们回显到源代码中。php

  <body <?php body_class();?>>
只需添加

<?php body_class();?>
在渲染body标记的线的上方或下方,可以非常愉快地显示所有body类,以便对它们进行设置。

如果我注释掉在标题中呈现body标记的行。仍然呈现使用php注释此body标记的php

<body cz-shortcut-listen="true">
所有主题都会出现这种情况,本地网络以外的用户以及chrome和firefox也会出现这种情况,因此这似乎不是主题或本地浏览器的问题。(另见下文更新2)

有没有人知道这可能是什么,这是一个非常头痛的问题,我很困惑这可能是什么,甚至是如何着手解决问题。

Staging site displaying the problem here:http://eco.clearintent.co.uk/

UPDATE:这发生在服务器上的每个WP安装上,因此不是WP安装或特定主题。

运行wordpress 4.2.4Server是在EC2 m3上运行Apache/2.2.29PHP/5.3.29Amazon Linux。中等实例。

UPDATE 2:尝试在运行apache 2.4和php 5.6的新ec2实例上安装vanilla wordpress只是为了看看,它也有同样的问题!不影响非wordpress网站。跨浏览器和网络发生,因此不特定于我的本地设置。

UPDATE 3:从命令行使用wget获取站点delivers the correct code WITH the body classes in the single body tag. - 我想知道(如下所示)这是否表明javascript是罪魁祸首,但当我在禁用javascript的情况下访问chrome网站时,问题没有解决,因此这似乎意味着javascript不是问题所在。

UPDATE 4根据下面的答案,问题确实存在于body标签中的奇怪字符,但是,删除和替换这行行不通。唯一有效的方法是围绕html注释中的第一行,并在下面有一行相同的未注释行,因此:

<!--<body <?php body_class(); ?>>-->
<body <?php body_class(); ?>>-->
如果删除顶部的注释行,则新键入的body标记上会再次出现错误
如果我从注释行中删除了body标记,但仍然有一个空注释,那么:

<!-- -->
<body <?php body_class(); ?>>-->
或者我在注释中包含body\\u class函数,因此:

<!--<?php body_class(); ?>-->
<body <?php body_class(); ?>>-->
该行为将重新出现,因此必须存在第一个body标记(即使已注释),以便新的body标记正确呈现。

我已经检查了Apache和php utf-8编码是否到位。我在浏览器中检查该页面是否显示为utf8,实际上是这样。在服务器上

 file -bi header.php 
将文件显示为ascii。

这让维德和维德越来越多,我有一种让事情运转起来的技巧,但不了解正在发生的事情。

如果您有任何关于如何调试的想法,我们将不胜感激。

谢谢

保罗

解决方案:见下文。为了清楚起见,我添加了一个单独的答案。

3 个回复
最合适的回答,由SO网友:Kevin Fodness 整理而成

我认为这是浏览器修改DOM的原因,因为您的body标记中有一个奇怪的字符。当我在Firefox中查看源代码时,我看到body标签旁边的“character not recognized”框。这在Firefox检查器中也可见。

现代浏览器会在呈现页面时自动修复HTML中的问题。例如,如果您有<table> 没有<tbody>, 浏览器将添加<tbody> 节,即使它不在标记中。我认为这里发生的是浏览器看到一个标记<bodyX> 哪里X 是一个错误的unicode字符,它无法将其识别为正文标记,因此它将剩余内容包装在适当的正文标记中,从而导致重复。这解释了为什么它在view source中不可见(因为view source是文本源,而不是在inspector中可见的修改后的源),wget将产生相同的行为。

尝试进入主题的头文件并删除body标记,然后重新键入,以删除任何奇怪的附加字符。

如果这样做不起作用,则可能是服务器上的某些内容在退出时错误地修改了body标记的内容。

SO网友:Tofuwarrior

我已经发布了一个答案,因此这更简洁,但已将有用的答案标记为已接受。

正如@Kevin Foddy指出的,最初的问题是浏览器无法看到<body 标记为正文标记,因为其中有奇怪的“字符”。

中的奇怪字符<body 标签让我思考。我已经调查了一个漏洞,但没有看到被利用的代码,但当我用wordfence扫描时,它发现一些文件被利用。当我打开这些时,没有可见的被利用的代码。嗯,嗯。直到

我在vi中打开了它们。然后可以看到大量漏洞。

我猜上面的行为(更新4)是因为漏洞没有检测到我包围了第一个<body> 标记入<!-- --> 所以我的第二个<body> 完整的当然,如果我删除了第一个,那么第一个<body 它检测到的标签是我的新标签,所以它把垃圾倒在那里。

现在,我已经从所有wp站点中清除了此漏洞<body> 渲染精细。

一个单独的角色<body> 实际上是一整段模糊的代码。我只是很幸运,我想用vi打开文件,否则我怀疑我会解决这个问题;我不知道nano的代码会以这种方式被混淆。教训-不要回避vi!

SO网友:Aaron Joseph

我也有同样的问题。

我有

<body <?php body_class(); ?>>

在“body”和开始的php标记之间有一个空格。删除空间修复了此问题:

<body<?php body_class(); ?>>

结束