問題描述
我正在嘗試寫一個 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。