◆ # を %23 に変換してリクエストしてる

xhr で # つきの URL へリクエストします

var xhr = new XMLHttpRequest()
xhr.open("GET", "/page.html#hash", true)
xhr.onloadend = function () {
console.log(xhr.status)
}
xhr.send(null)

page.html はあるので Chrome や IE11 では問題なく page.html のデータを取得できます
ですが IE 10 以前の場合は # をエスケープして 「/page.html%23hash」 にアクセスしようとします
そのせいで 404 エラーです

普通はわざわざ # 付きの URL を指定したりしないのですが 開いているページに # がつく可能性があってそのページで自身に対して POST させる処理をしていました
自身への POST ならわりとありえそうですし 見出しにジャンプさせるためのページ内リンクがあれば十分発生しそうです
なのでこの現象は IE 対応を普段からしてる人には常識レベルのことだったりするのかもしれません


いまさら IE 10 をサポートなんてしたくもないのですが 頼まれたので適当にこんな感じで # を無視させるようにしました
if(document.documentMode !== 11){
!function(){
var orig = XMLHttpRequest.prototype.open
XMLHttpRequest.prototype.open = function(){
arguments[1] = arguments[1].split("#")[0]
orig.apply(this, arguments)
}
}()
}