2016-11-14 61 views
0

有一个客户端,其中包含大量标识符。我们在URL中使用这些标识符。 (为什么他们的软件允许SKU编号中的特殊字符是另一天的问题。)IE和边缘点击时将%2F转换为%252F

使用Apache 2.4,AllowEncodedSlashes设置NoDecode并正常工作。但是,在IE和Edge中的某些客户端计算机上(如果问题出现在两者中),单击链接时,甚至粘贴到地址栏中,都可以看到它将%2F更改为%252F 。

在这些机器上,Chrome和Firefox工作正常。

样品网址:(正确)

https://www.grandbrass.com/item/bb0-5%2F8x4%2F36/balls-round_solid_turned_metal_balls/

变为:(不正确)

https://www.grandbrass.com/item/bb0-5%252F8x4%252F36/balls-round_solid_turned_metal_balls/

在这些机器上,这是一致的。

AFAIK这是在浏览器中立即发生的。

我怀疑这是与页面编码和客户端的语言设置或类似的东西有关,但我甚至无法开始猜测问题可能是什么。

这里是一个链接到(低质量)视频显示它发生。 https://recordings.join.me/oM6XCRZ_0kOYuEn9OjtWAg

**更新**

似乎有什么东西在服务器上mod_rewrite的事情。为什么它只影响Edge和IE在某些机器上尚不清楚,但我可以在Chrome中复制它。

看来,如果任何其中有%2F的URL触发了一个mod_rewrite规则,那么此时%2F将被%252F替换。

例如,有一个规则来添加结尾斜线如果丢失:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !\..+$ 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [R=301,L] 

所以此工程: https://www.grandbrass.com/item/crb1-1%2F8x8/checkrings-plated_steel_checkrings/

这(注缺乏斜线的)不会: https://www.grandbrass.com/item/crb1-1%2F8x8/checkrings-plated_steel_checkrings

我到底是什么了在第二种情况是(注意添加斜线和翻译%2F): https://www.grandbrass.com/item/crb1-1%252F8x8/checkrings-plated_steel_checkrings/

这是造成的问题,因为在PHP中,我最终将crb1-1 // F8x8作为不是有效项目代码的值。

回答

0

问题原来是,当HREF中的URL包含%2F时,如果重写规则被触发,%2F将被mod_rewrite重新编码。

将“NE”添加到修复问题的规则中。例如:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !\..+$ 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [**NE**,R=301,L] 

我仍然无法解释为什么运行IE或Edge的Windows机器的子集一直触发Chrome,Firefox等不支持的规则。

0

你试过从更新URL : https://www.grandbrass.com/item/bb0-5%2F8x4%2F36/balls-round_solid_turned_metal_balls/

到: https://www.grandbrass.com/item/bb0-5 4,4 36 /球,round_solid_turned_metal_balls/

我想,这可能会奏效。由于其工作已经将空间编码为%2F的系统,并希望在系统进行双重编码的情况下,%2F可能会执行一次,这可能会解决问题。这不是一个合适的解决方案,但可能有效。试试吧。

另外我会建议看看在开发人员工具中的网络选项卡。当你从存在问题的系统中点击这些URL时,他们是否向Apache发送了正确的URL?

另外,你可以使用重定向在apache中处理这个问题。

+0

我试过了,它没有工作。 %2F不是空格,它是斜杠。它适用于大多数系统,只是不是一些IE和Edge浏览器。 AFAIK它在浏览器中执行它,而不是整个跳到服务器。 –