浏览器将 URL 的路径部分中的编码斜杠 (%2F) 转换为文字斜杠 (/)
Browser converts encoded slash (%2F) to literal slash (/) in path portion of URL
我目前正在使用 ASP.NET Identity.
注册后使用电子邮件确认
此库提供完成注册所需的令牌生成。此令牌在我们的应用程序中用于以下路径:
https://localhost/#/account/{token}/setup
令牌是通过调用生成的:
var emailToken = _userManager.GenerateEmailConfirmationToken(newUser.Id);
生成令牌后,我通过 string.Format
将其添加到路径中:
string.Format("https://localhost/#/account/{0}/setup", HttpUtility.UrlEncode(emailToken));
结果如下所示:
但是当我在浏览器中打开这个 url 时,我得到:
...等等!
我看到的是 url 在电子邮件正文中正确编码,但是当我在浏览器中打开它时通过替换编码的 "%2f" 进行了解码。 =44=] 到 "/"。这导致我的应用程序中出现无效路由,因为我希望“/”成为不同资源之间的分隔符。
对这种行为有什么想法吗?
参考文献:
它可能正在解码它,因为它认为它是路径的一部分。
我建议您明确地将其视为参数。这将告诉浏览器不要解码它。例如,而不是这条路径:
https://localhost/#/account/AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQh........
使用此路径:
https://localhost/#/account/?t=AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQh......
请注意在帐户路径结束后添加 ?t=
。
然后在您的应用程序中使用 t
参数。这将告诉浏览器末尾的值不会被解码为路径的一部分,而是以编码形式保留,因为它是一个参数。
这显然会改变你的路径(因为设置部分)所以相应地调整。
我目前正在使用 ASP.NET Identity.
注册后使用电子邮件确认此库提供完成注册所需的令牌生成。此令牌在我们的应用程序中用于以下路径:
https://localhost/#/account/{token}/setup
令牌是通过调用生成的:
var emailToken = _userManager.GenerateEmailConfirmationToken(newUser.Id);
生成令牌后,我通过 string.Format
将其添加到路径中:
string.Format("https://localhost/#/account/{0}/setup", HttpUtility.UrlEncode(emailToken));
结果如下所示:
但是当我在浏览器中打开这个 url 时,我得到:
我看到的是 url 在电子邮件正文中正确编码,但是当我在浏览器中打开它时通过替换编码的 "%2f" 进行了解码。 =44=] 到 "/"。这导致我的应用程序中出现无效路由,因为我希望“/”成为不同资源之间的分隔符。
对这种行为有什么想法吗?
参考文献:
它可能正在解码它,因为它认为它是路径的一部分。
我建议您明确地将其视为参数。这将告诉浏览器不要解码它。例如,而不是这条路径:
https://localhost/#/account/AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQh........
使用此路径:
https://localhost/#/account/?t=AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAA6gbQh......
请注意在帐户路径结束后添加 ?t=
。
然后在您的应用程序中使用 t
参数。这将告诉浏览器末尾的值不会被解码为路径的一部分,而是以编码形式保留,因为它是一个参数。
这显然会改变你的路径(因为设置部分)所以相应地调整。