问题描述
我正在尝试写一个 oneboxing 例程,给 WordPress 博客条目特别的处理。所以给出一个简单的,未装载的内容的 URL,比如
http://blog.stackoverflow.com/2011/03/a-new-name-for-stack-overflow-with-surprise-ending/
我如何检测到这是一个 WordPress 安装,理想情况下,在我看到的每个网址上都没有完整的 HTTP GET 。
我们可以从 WordPress URL 确定一些常见的约定,从而至少消除了一些争用的网址。在这种情况下,它是…
但这也不是普遍常态。
我尝试使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。