0

我真的很困惑当 URL 设置为查询字符串中的值时,我应该编码多少次,因为我们知道浏览器有自己的编码过程。这是场景:

  • 我想重定向到另一个我想传递上一个 URL 的位置: 注意:当前 URL 是http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE

方法A(不带encodeURIComponent()):

window.location = 'CostEstimateApproval.aspx?CEMID=40' + 
        '&ToStatus=1CE'+
        '&PrevURL=' + window.location;

我在地址栏中得到这个

http://localhost:8081/CostMonitoring/CostEstimateApproval.aspx?CEMID=40&ToStatus=1CE&PrevURL=http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE

没有encodeURIComponent(),一切正常,Request.Querystring("PrevURL")接收页面中的值为

http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE 

哪个是对的。

方法 B(带encodeURIComponent()):

window.location = 'CostEstimateApproval.aspx?CEMID=40' + 
        '&ToStatus=1CE'+
        '&PrevURL=' + encodeURIComponent(window.location);

使用这种方法,我在地址栏中得到了这个:

http://localhost:8081/CostMonitoring/CostEstimateApproval.aspx?CEMID=40&ToStatus=1CE&PrevURL=http%3A%2F%2Flocalhost%3A8081%2FCostMonitoring%2FMainMenu.aspx%3FOption%3DAllCE

Request.Querystring("PrevURL")接收页面中的 值为

http://localhost:8081/CostMonitoring/MainMenu.aspx?Option=AllCE 

这也被正确解码。

我的问题:

  1. 我应该将 URL 编码为值吗?如果我编码它然后浏览器再次编码它会是多余的吗?

  2. 还是应该让浏览器为我编码?如果我让浏览器,接收页面是否会从 URL-as-a-value 的值混淆为真正的 URL 值?请考虑这个例子:

    http://www.domain.com/newpage.aspx?SameName=DifferentValue&PrevURL=http://www.domain.com/oldpage.aspx?SameName=DifferentValue&PrevURL=http://www.domain.com/anypage.aspx

如您所见,两个 URL(真实 URL 和 URL-as-a-value)在未编码时具有相同的数据名称,即SameName. 接收方如何处理这个问题?还是 HTTP 服务器?

提前致谢!

4

1 回答 1

2

您应该使用encodeURIComponent(一次),因为您正在对 url 参数进行编码。

正如您在问题末尾所指出的那样,encodeURIComponent如果您的 url 包含&例如

请注意,您的方法 A 之所以有效,是因为您的示例prevUrl有点简单,例如它不包含第二个 url 参数。

于 2011-07-30T02:29:42.040 回答