问题描述

我正在尝试写一个 oneboxing 例程,给 WordPress 博客条目特别的处理。所以给出一个简单的,未装载的内容的 URL,比如

http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/

我如何检测到这是一个 WordPress 安装,理想情况下,在我看到的每个网址上都没有完整的 HTTP GET 。

我们可以从 WordPress URL 确定一些常见的约定,从而至少消除了一些争用的网址。在这种情况下,它是…

http://example.com/year/month/slug-goes-here

但这也不是普遍常态。

我尝试使用 HTTP HEAD 查看该 URL 的标题,我看到:

Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:18340
Content-Type:text/html; charset=UTF-8
Date:Thu, 07 Jun 2012 07:07:38 GMT
Keep-Alive:timeout=15, max=100
Server:Apache/2.2.9 (Ubuntu) DAV/2 PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
Vary:Cookie,Accept-Encoding
WP-Super-Cache:Served legacy cache file
X-Pingback:http://blog.stackoverflow.com/xmlrpc.php
X-Powered-By:PHP/5.2.6-2ubuntu4.2

我不认为依靠 WP-Super-Cache 的存在将是特别可靠的,这是唯一的东西,我看到的标题将有所帮助,所以也许在 WordPress 安装中有零个常见的 HTTP 标头?

最佳解决方案

从我的经验和快速的代码搜索,WP 没有在标题中识别自己的方法。然而,有些似乎不够完整,不太可能被定制。

HEAD 到/wp-login.php 将包含.org 安装的以下内容:

 Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/

而对于.com:

Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/; domain=.wordpress.com

Cookie 名称可以通过定义 TEST_COOKIE 常量来定制,但是 WP Cookie check 字符串在内核中是硬编码的,还有 set_cookie()在文件的源文件中调用。

为了定位 wp-login.php,有一些 URL 快捷方式 (从 WP 3.4 开始,在 wp_redirect_admin_locations()中实现)(参见机票 #19607):

 /login 在站点的根目录下,302 重定向到 wp-login.php,无论它在哪里。

所以唯一的情况是无法可靠地检测到,如果 WP 安装在并限制在子目录中,而不用于管理站点的根目录。

次佳解决方案

发送 HEAD 请求到/wp-feed.php 在与/xmlrpc.php 相同的目录 (即使在子目录安装) 。在 WordPress 中,您将获得一个 Location 标题作为包含字符串 feed 的响应。

在您的 blog.stackoverflow.com 示例中,您将得到:

HTTP/1.1 301 Moved Permanentlyrn
Date: Thu, 07 Jun 2012 07:30:10 GMTrn
Server: Apache/2.2.9 (Ubuntu) DAV/2 PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8grn
X-Powered-By: PHP/5.2.6-2ubuntu4.2rn
Location: http://blog.stackoverflow.com/feed/rn
Vary: Accept-Encodingrn
Content-Type: text/html; charset=UTF-8rn
rn

文件 xmlrpc.php 单独存在不够安全。任何人都可以将此名称提供给文件。

注意事项:可以通过过滤'wp_headers'来禁用 X-Pingback 标题。所以我的建议不是 bullet-proof 。

相关:Steps to Take to Hide the Fact a Site is Using WordPress?

第三种解决方案

使用?page_id=-1 附加 URL 并对其执行 HTTP HEAD 请求。

在 self-installed WordPress 博客上,这将导致 404 响应。

在 wordpress.com 博客上,这将导致一个 301 的响应 (如果您遵循重定向,最终将在 200 响应) 。

在 non-WordPress 网站上,您应该得到一个 200 响应 (假设没有查询字符串的原始 URL 给你一个 200) – 查询字符串应该没有区别。

http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/?page_id=-1 的 HEAD 请求示例:

HTTP/1.1 404 Not Found
Server: Apache/2.2.9 (Ubuntu) DAV/2 PHP/5.2.6-2ubuntu4.2 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
Content-Encoding: gzip
Vary: Cookie,Accept-Encoding
Cache-Control: no-cache, must-revalidate, max-age=0
Last-Modified: Thu, 07 Jun 2012 08:53:01 GMT
Date: Thu, 07 Jun 2012 08:53:01 GMT
Keep-Alive: timeout=15, max=100
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Pragma: no-cache
Connection: Keep-Alive
X-Powered-By: PHP/5.2.6-2ubuntu4.2
X-Pingback: http://blog.stackoverflow.com/xmlrpc.php
Content-Type: text/html; charset=UTF-8

http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/?page_id=-1 的 HEAD 请求示例 (关闭重定向功能):

HTTP/1.1 301 Moved Permanently
X-Pingback: http://dailycrave.wordpress.com/xmlrpc.php
Server: nginx
Expires: Wed, 11 Jan 1984 05:00:00 GMT
X-Hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.
Location: http://dailycrave.wordpress.com/2012/06/01/three-cheese-grilled-pizza/
Pragma: no-cache
Cache-Control: no-cache, must-revalidate, max-age=60
Connection: close
Last-Modified: Thu, 07 Jun 2012 09:01:09 GMT
Content-Type: text/html; charset=UTF-8
Date: Thu, 07 Jun 2012 09:01:09 GMT

(注意 X-Hacker 复活节彩蛋!)

如果您按照 wordpress.com 博客的 301 重定向,您最终可以这样做:

HTTP/1.1 200 OK
Server: nginx
Vary: Accept-Encoding, Cookie
Last-Modified: Thu, 07 Jun 2012 09:48:26 GMT
Cache-Control: max-age=172, must-revalidate
Connection: close
Date: Thu, 07 Jun 2012 09:50:34 GMT
Transfer-Encoding: Identity
Content-Encoding: gzip
Link: <http://wp.me/pXGqK-27g>; rel=shortlink
X-Pingback: http://dailycrave.wordpress.com/xmlrpc.php
Content-Type: text/html; charset=UTF-8
X-Nananana: Batcache
X-Hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

请注意包含 http://wp.me/网址的”Link” 标头,这些 URL 似乎是所有 wordpress.com 托管博客的共同之处,可用于标识它们。

我相信这是有效的,因为在 URL 中传递?page_id=-1 会覆盖 URL 段中的默认路由。不会有 ID 为-1 的网页,因此系统会投放 404 /redirect 。

第四种方案

所有 wordpress 安装中都不提供 wp-super-cache,也不会有任何固定格式的 URL 。虽然固定链接设置页面为可以使用的 URL 方案提供一些固定的设置,但任何人都可以使用任何自定义 URL 方案。例如,如果任何人只是决定在 URL 中仅使用页面/帖子名称,或多或少无法确定它是否是 Wordpress 网站。

可以使用 xmlrpc 的存在来检测,但是再次可以禁用它。

最后,即使你完全了解 URL,仍然不能 100%检测是否使用 wordpress 构建页面。这一切都取决于主题模板及其开发。

一个相当可靠的方法是寻找 wp-login 和 wp-admin 的存在。但即使这些也可能被移动。我会去这样做的。

参考文献

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