Windows上使用IPv6所遇到的UNC路徑限制

雖然我們很不想支援IE,但我們還是要在IE上測試我們的軟體,是否有支援IPv6;不幸地,在使用IPv6位置連接後,就發生了JavaScript的錯誤。打開開發人員工具查看一下發現是語法錯誤,這是與websockt相關的程式碼:


我的測試環境為Win7,IE11 11.0.9600.19356,測試結果可能會因為瀏覽器版本不同有所差異。

經過同事查詢,說這應該是Windows的限制,IPv6中的冒號為UNC路徑不合法字元。只要使用Literal IPv6 address就可以避免此問題(參考link),假設你的IPv6為:

2001:db8:85a3:8d3:1319:8a2e:370:7348

只要將:變為-,然後在後面串上.ipv6-literal.net,Windows可以不透過DNS自動幫你轉換這樣的名稱:

2001-db8-85a3-8d3-1319-8a2e-370-7348.ipv6-literal.net

除此之外,我嘗試去調整wicket的wicket-websocket-jquery.js,在建websocket之前將IPv6改為Literal IPv6 address:

var ws_host_addr = document.location.hostname.replace(/[\[\]]/g, '');
ws_host_addr = ws_host_addr.replace(/:/g, "-");
ws_host_addr += ".ipv6-literal.net";
 
url = protocol + '//' + ws_host_addr + _port + WWS.contextPath + WWS.filterPrefix + '/wicket/websocket';

但jetty會找不到對應的session。

目前會使用的Workaround為:

  • 使用Literal IPv6 address去避掉這問題。
  • 如果User使用FQDN存取Server,也不會有這個問題。