I’ve found the root of the rest problem: The max length of url has very strict limitation under the h2 mode on some old versions of the chrome blink engine. Even if the same url just working fine under the http/1.1 mode with the exactly same blink engine.
For example: We have an url with 2713 bytes of length, and it is not working under h2 mode for the chrome 49.
The solution is very simple: Just shrink the url length. For example, we have a function deal with the js file batch loading, here is the pseudo code to cover this problem:
// gstJsList is an array of js files, like: ["a.js", "b.js", "c.js", ...]
// Let's assume there is 90 files in it: gstJsList.length == 90
// Load all file listed in gstJsList at one shoot;
// Load files listed in gstJsList by 9 rounds with 10 files per round
// Don't use the browser's agent sting to make the decision, because
// it is not accurate: some third party browser base on the blink engine
// does not show the "chrome" on it (e.g.: The official browser of HUAWEI
// mobile phone).
We are using HAProxy 1.8.13 now, and in conjunction with the above solution, it successfully passed all of our compatibility tests. And no more browser compatibility complaints so far.