Posted by Victorlau | Posted in IT Sleepless | Posted on 07-Feb-2010
在使用OpenX來管理網站的廣告後, 無可避免的一個問題, 就是播放的廣告會被某些瀏覽器(Firefox, Chrome等)的某些Ad-Blocker (廣告封阻, 廣告阻擋, 廣告攔截, 等等), 今天就要介紹一下這個問題的解決方法.
首先題外話幾句. 作為一個普通上網用戶, 自然不希望看到那些令人眼花的廣告, 同時也加重了網頁的loading; 但作為網站開發者, 廣告系統的正常運作卻是生存命脈. 這是一種雙重角色的矛盾. 但作為一個有專業精神的IT民工, 只能硬著頭皮在這些Ad-Blocker的阻攔下殺出一條生路來.
言歸正傳, OpenX 分發廣告是通過一個簡單的應答機制來實現的. 它使用了一個叫spcjs.php 的腳本來接收zone_id和banner_id等參數, 默認路徑為是http://your-ad-server-domain.com/www/delivery/spcjs.php (2.6之前是叫ajs.php). 而作為一個著名的Ad Server, OpenX 注定要成為各大Ad-Blocker的主要打擊對象. 這些Ad-Blocker的工作方式一般都是通過對HTTP Request的URL Pattern 進行過濾來實現廣告封阻. 例如Firefox世界里很出名的AddBlock Plus就是通過這種過濾器的方式實現. 本文下面的例子也是針對AddBlock Plus的.
AddBlock Plus里可以訂閱不同的過濾列表, 其中Easy-US-List 是預設訂閱的, 這里以這個List作為一個簡單例子. 在Easy-US-List里, 可以找到一堆關於OpenX的封阻, 其中重要而又比較容易忽略的是:
- spcjs.php (這個很絕, 直接把它封了…)
- */www/delivery/* (這個明擺著是針對OpenX的了)
- http://ads.* (所以千萬不要把你的Ad Server Domain設成ads.yourdomain.com 啦)
- spc.php (這個很隱蔽, 因為這是spcjs.php 處理完分析後, 播放廣告的文件, 沒有在最開始的HTML代碼里出現)
主要是上面這4點, 其他的針對banner_id, zone_id, openx* 的過濾就很容易發現和處理.
好, 找到原因, 跟著就是找出解決方法. 既然Ad Blocker是通過URL Pattern來過濾, 也就是說, 只要我們把上面幾點的URL都改了不就可以了嗎? 沒錯, 就是這樣.
這里強烈不建議大家去修改OpenX 的PHP源代碼, 難度太高, 也沒必要. 比較簡單做法是通過URL Rewrite 來把上面的URL都改了, 例如:
- 建立一個forward 規則把spcjs-ox.php 轉到spcjs.php (URL還是spcjs-ox.php), 在Web Server里設一下就OK.
- 把*/www/delivery/* 分發路徑改成*/www/d/* (delivery 是一個比較adblocker sensitive的詞). 這個在OpenX的config 文件里找出來修改, 默認是: /your-openx-installation-path/var/your-config-file.
- 不要用http://ads.* 開頭的sub-doamin 啦, 可以換成http://a.your-domain.com 之類的.
- 改掉spc.php的名字, 這個也是在config 文件里找出來修改.
對於其他的過濾情況, 可以相應地針對著來修改, 方法類似, 這里就不多囉嗦啦.
至此, 你的OpenX應該就可以逃過AdBlock Plus 的Easy-US-List的封阻啦. 如果你想連其他的什麼China-List 也做掉, 方法也是類似的, 不過前提你要把AdBlock Plus安裝了, 然後查看這些List的規則, 所謂知己知彼, 才能百戰百勝. 不過, 這種基於過濾規則的Ad Blocker, 好處是可以不停地加入新的規則, 例如有個用戶把我們新改的*/www/d/* 也加進過濾器(慶幸大部分的普通用戶都只是用默認的過濾規則), 那我們就得再改成別的URL, 這是一個沒有終點的苦旅, 如果我們動不動就去修改OpenX的代碼, 這就太沖動了.
以上方法只能在self-host 的OpenX Server才有效, 因為你需要Web Server和OpenX的配置管理權限. 至於最近也很受觀迎的Google Ad Manager, 自然也是大受各大Ad Blocker的觀迎, 只是Google好像不太會讓我們自己來修改配置吧(OpenX 再加一分!).
Related posts:



