CDN 是放在你的網站前面的一層服務,它會把網站內容複製到世界各地,讓訪客從最近的地方拿資料,所以網站會變快。它通常也附帶防護功能,可以擋掉攻擊流量。
這些好處都是真的。但它多了一層,而所有的問題都發生在那一層。
網站變快了,詢價變少了
最典型的狀況是這樣:裝了 CDN,網站速度確實有感變快,大家都很滿意。
然後過了一兩個月,有人提到「好像比較少收到詢價」。
你去後台看,表單功能完全正常,你自己測試也送得出去。流量報表也沒有下降。
問題是你測得出來,不代表所有人都測得出來。這一類問題幾乎都只影響一部分訪客,而送不出去的那些人不會打電話告訴你,他們會關掉網頁。
這也是為什麼它可以持續好幾個月沒被發現。
原因一:安全規則把表單當成攻擊
CDN 的防護功能會檢查送進來的內容,看起來像攻擊的就擋掉。
問題是判斷規則是通用的,它不知道你的表單應該長什麼樣。訪客在需求欄位裡寫的某些內容,剛好符合攻擊特徵,就被擋了。
常見的誤判來源:
- 網址(有人習慣把參考網站貼在需求欄)
- 程式碼片段或 HTML 標籤
- 一些特定的英文單字組合
- 內容太長
徵兆:只有某些人送不出去,而且同一個人每次送都失敗。訪客看到的通常不是你網站的錯誤訊息,而是一頁陌生的攔截畫面。
這一種的麻煩之處是:你的主機紀錄裡完全沒有那筆送出的紀錄,因為請求在 CDN 那一層就被攔掉了,根本沒進來。所以你翻後台會覺得這個人從來沒按過送出。
原因二:快取把一次性驗證碼存下來了
這一種比較隱晦,但影響範圍最大。
現在的表單為了防機器人亂送,頁面上通常會夾帶一組一次性的驗證碼。它的運作方式是:頁面產生的時候塞一組隨機字串進去,送出的時候比對,對得上才收。
CDN 做的事情是把頁面存起來重複使用。
如果包含表單的那一頁被存了下來,所有訪客拿到的會是同一組早就過期的驗證碼。送出的時候一律比對失敗。
徵兆:
- 幾乎所有人都送不出去,不是只有部分人
- 錯誤訊息是你網站自己的(例如「驗證失敗,請重新整理」)
- 重新整理一次之後有時候可以送
- 你自己測常常是好的 —— 因為你剛改過網站,快取是新的
這一種的解法不是關掉快取,是把有表單的那幾頁排除在快取之外。
原因三:檔案上傳超過大小上限
如果你的表單可以附檔案,這一條要特別注意。
CDN 對通過它的請求有大小上限,而且這個上限通常比主機本身的上限小。免費方案的上限可能只有 100MB,有些方案更低。
訪客傳一個稍大的檔案,CDN 直接拒收。
徵兆:不附檔案送得出去,附檔案就失敗;而且檔案越大越容易失敗。這一條很容易驗證。
原因四:訪客被要求通過人機驗證
CDN 判斷某個訪客可疑的時候,會先丟一個驗證畫面給他。通過了才讓他進來。
多數人會通過。但有兩種人會卡住:用公司共用網路的(整層樓同一個 IP,被判定為流量異常)、以及開了隱私保護功能的(現在手機和瀏覽器都有這類功能,會讓訪客的來源看起來很奇怪)。
徵兆:訪客說「一直叫我證明我不是機器人」或「一直轉圈圈」。這類訪客連頁面都不一定看得到,不只是表單送不出去。
怎麼確認、怎麼排除
先做這兩件事,範圍就縮小一半:
第一,自己送一次,但用無痕視窗 + 手機行動網路。
目的是排掉你自己的瀏覽器快取和公司網路。你平常測得出來,有很大一部分是因為你的環境跟訪客不一樣。
第二,比對兩邊的紀錄。
CDN 的後台有自己的紀錄,會顯示它攔掉了哪些請求。把它跟主機的紀錄對照:
- CDN 有紀錄、主機沒有 —— 被 CDN 擋掉了,往原因一或原因四查。
- 兩邊都有紀錄,但失敗 —— 進到主機了,往原因二(驗證碼)查。
- 兩邊都沒有紀錄 —— 訪客根本沒按到送出,問題在前端或頁面本身。
這個對照幾乎可以直接定位,不用猜。
最後一件事:排除的方向是調整規則,不是關掉防護。把防護整個關掉確實表單就通了,但你同時失去了當初裝 CDN 的一半理由。正確的做法是針對表單那幾個路徑放寬規則、把表單頁排除快取,其他地方照舊。
這一類問題最貴的成本不是修的時間,是它可以安靜地吃掉好幾個月的詢價。我們接手網站的時候,表單一定會從外部網路實際送一次,並且比對 CDN 和主機兩邊的紀錄 —— 因為後台看起來正常,不等於客戶送得進來。如果你的網站有裝 CDN 而且最近詢價變少,這件事值得先確認。需要的話可以看一下我們的維護方案。
