jQuery Ajax成功回调中移除URL的~符号并实现页面跳转问题
嘿,我看你遇到的问题是后端返回的RedirectURL带了ASP.NET风格的~/前缀,前端处理后跳转总是失败,停在原页面对吧?咱们来拆解一下问题,然后给出靠谱的解决方案。
首先得搞清楚为什么之前的处理没用:你用removeChar切掉第一个字符后,~/myPost.aspx变成了/myPost.aspx,然后又拼接了http://www.example.com/,结果就成了http://www.example.com//myPost.aspx——双斜杠的问题!虽然浏览器有时候能兼容,但很多服务器会把这种路径解析成错误地址,导致404,自然就跳不动了。
另外,~/在ASP.NET里是应用根路径的标识,不是简单的字符替换就能搞定的,如果你的应用不是部署在域名的根目录(比如部署在http://www.example.com/myApp/),直接替换~还会导致路径错误。
下面给你几个可行的解决方案:
方案1:正确处理~/前缀,避免双斜杠
用正则精准匹配开头的~/,替换成空字符串,再拼接域名,这样就不会出现双斜杠了:
$.ajax({ // 省略其他配置 success:function(data) { var value = JSON.parse(data.d); let rawURL = value.dataSet.Table[0].RedirectURL; // 正则匹配开头的~/,替换为空 let cleanedURL = rawURL.replace(/^~\//, ''); // 拼接成正确的绝对路径 window.location.href = "http://www.example.com/" + cleanedURL; } });
这样~/myPost.aspx会被处理成myPost.aspx,最终拼接成http://www.example.com/myPost.aspx,路径完全正确。
方案2:让后端返回完整路径(推荐)
最省心的办法是让后端直接返回完整的绝对URL(比如http://www.example.com/myPost.aspx),这样前端不需要做任何处理,直接赋值给window.location.href就行,避免前后端路径标识的差异问题。
方案3:适配应用根目录(如果部署在子目录)
如果你的ASP.NET应用部署在域名的子目录下(比如http://www.example.com/myApp/),那~/对应的是/myApp/,这时候前端可以先获取应用的根路径:
在你的ASP.NET页面里,添加一段脚本输出根路径:
<script> // 由ASP.NET渲染出应用根路径,比如"/myApp/" var appRootPath = '@Url.Content("~/")'; </script>
然后前端拼接时用这个根路径:
$.ajax({ // 省略其他配置 success:function(data) { var value = JSON.parse(data.d); let rawURL = value.dataSet.Table[0].RedirectURL; let cleanedURL = rawURL.replace(/^~\//, ''); window.location.href = appRootPath + cleanedURL; } });
最后,排查问题的小技巧:打开浏览器的开发者工具(F12),切换到Network面板,看跳转请求的状态码,如果是404,说明路径肯定不对,复制请求的URL去地址栏访问一下,就能快速定位问题啦。
内容的提问来源于stack exchange,提问作者Rohan Rao

