【茶包射手日記】web.config 設定鬼故事

同事報案,某網站委託 OP 上線出現異常,連至本機查看詳細錯誤訊息,ASP.NET 回報看不懂 </location> 元素。

上圖的 <location path="Area51">...</location> 是本次新增設定,是應用先前介紹過的 Windows 驗證網站設定部分匿名存取技巧,用 <location> 針對部分路徑做不同設定的做法過去用得很多,不該有錯,更何況同一 web.config 的前一段就活生生是另一個 <location> 相安無事,惟獨新加的 <location> 有問題。

用記事本反覆檢查 web.config,兩個人四隻眼睛看到出血,逐字母檢查一遍又一遍,就是看不出哪裡有問題:

做了幾個測試:

  1. 將 <location path="Area51"> 改成 <location path="Shit" >,錯誤仍指向同段 <location>
  2. 將 <location path="Area51"> 該段刪除,網站正常
  3. 將 <location path="Area51"> 與前段 <location> 交換位置,錯誤仍指向 Area51 這則
  4. 將 <location path="Area51"> 該段刪除,另外重新輸入完全相同內容,網站正常

同事高呼「見鬼了」,老射手則嘟嚷:「不對,有妖氣!」。

請同事將 web.config 傳回本機用 Notepad++ 開啟,薑! 薑! 薑! 薑~ 答案揭曉,<location path="Area51"> 這段前方的縮排空白,其實是特殊字元:

這就能解釋為什麼只有這段 <location path="Area51"> 會出錯,刪掉正常,手工重打一次也正常。至於這些看似空白的字元從何而來,問了同事。原來是這段設定是透過 HipChat 交談追加的(如下圖示意),OP 直接複製對話內容貼上,未察覺縮排前方的空白其實是特殊字元。

而這些奇怪字元是什麼呢? 它們是 EN SPACE (&ensp;),UTF8 字碼為 0xe2 0x80 0x82:

以前只學過 &nbsp;(ASC 160) 其實還有 &ensp;、&emsp;,都屬於不會被合併的空白,而寬度分別為一個標準空白鍵字元、半個中文字寬及一個中文字寬(參考:HTML字元符號 &Nbsp; &Ensp; &Emsp; 的差異 - ShunNien's Blog)。

進一步爬文,在 Unicode 字元還有很多看起來像空白但不是空白的特殊字元。(參考:HTML Unicode UTF-8)

【心得】

  1. 下回遇到看不出任何異樣卻回報有錯的 config、XML、程式碼,不要只用眼睛檢查,應先以工具排除假空白及隱形字元陷阱。
  2. 想讓討厭的程式設計師同事發瘋,不用紮稻草人下降頭,偷偷在他的程式碼裡加點料就可以了。
歡迎推文分享:
Published 01 September 2018 12:11 AM 由 Jeffrey
Views: 2,553



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2018>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication