单击时,IE和Edge将%2F转换为%252F

时间:2016-11-14 20:32:36

标签: apache internet-explorer microsoft-edge

让客户端有很多标识符,其中包含/ s。我们在URL中使用这些标识符。 (为什么他们的软件允许SKU编号中的特殊字符是另一天的问题。)

使用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作为非有效项代码的值。

2 个答案:

答案 0 :(得分:0)

您是否尝试过更新网址? 从: https://www.grandbrass.com/item/bb0-5%2F8x4%2F36/balls-round_solid_turned_metal_balls/

于: https://www.grandbrass.com/item/bb0-5 8x4 36 / balls-round_solid_turned_metal_balls /

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

另外,我建议您查看开发人员工具中的网络标签。当您从存在问题的系统中单击这些URL时,他们是否向apache发送了正确的URL?

或者,您可以使用重定向在apache中处理此问题。

答案 1 :(得分: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等不执行的规则。