最大长度的URL是多少?
这可能与手机型号有关;在桌面上,它绝对取决于浏览器,正如这个问题所讨论的那样。
我对规范或参考文献以及经验数据都很感兴趣。
我的特定用例是将一个非常长的(约1600个字符)URL传递给MIDlet.platformRequest(String url)
,但失败了。其中绝大部分的URL(约1575个字符)是查询。
传递非常长的URL时是否有其他注意事项(例如移动代理和网关截断URL)?
简短回答:这取决于情况,但可能会很长。
经过对SonyEricsson J2ME模拟器(WTK 2.2.4)、K610i和三星U700V的调查后,得到了以下长篇回答。
经验测试:从模拟器中,platformRequest()
直接将 URL 传递给桌面浏览器(在本例中为 Firefox)。
http://test.example.com/?q=2048xxxxxxxxxxxxxxxxxxxxxxxxxxxx... xxxxxxxxxxxxxxxxxx2048
查看测试服务器的日志,我们发现可以从模拟器通过非常长的URL传递到桌面和服务器。
在设备上(例如SonyEricsson K610i,用户代理:“SonyEricssonK610i/R1CB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1”),至少可以处理长度为3072个字符的URL(上限约为3800)。
在第二个设备Samsung U700V上,用户代理:“Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 MG(Novarra-Vision/7.3)” ,URL长度的下限为2048,但上限小于3072。请注意,这可能是Novarra转码器的问题,已知它至少会重新编写用户代理字符串。
没有Novarra转码(切换网络)的情况下,U700V具有用户代理"SAMSUNG-SGH-U700-Vodafone/BUGK1 SHP/VPP/R5 NetFront/3.4 Qtv5.3 SMM-MMS/1.2.0 profile/MIDP-2.0 configuration/CLDC-1.1",并且具有3072个字符的下限。
这个实验有效地结束了我对这个问题的兴趣,因为这个经验性测试证明了我的理论,即 URL 长度的上限导致了我的问题无效。
然而,为了完整起见,我将包括一个可能导致我的问题的原因:
连接所需的 URL 至少有两个查询参数。分隔查询的和号似乎会让模拟器混淆。
模拟器会默默地丢弃第二个参数。
在三星手机上,如果没有第二个参数,浏览器可以连接,但是长参数会损坏或丢失。
在 K610i 上使用第二个参数时,浏览器无法正常启动。
Microsoft Internet Explorer(浏览器) 微软表示,Internet Explorer中URL的最大长度为2,083个字符,其中路径部分的字符数不得超过2,048个。在我的测试中,尝试使用超过此长度的URL会在Internet Explorer中产生明显的错误消息。 Firefox(浏览器) 在Windows Firefox 1.5.x中,超过65,536个字符后,位置栏不再显示URL。但是,更长的URL仍然可以工作。我在测试了100,000个字符后停止了测试。 Safari(浏览器) 至少80,000个字符可以工作。我在测试了80,000个字符后停止了测试。 Opera(浏览器) 至少190,000个字符可以工作。我在测试了190,000个字符后停止了测试。Windows版Opera 9即使在190,000个字符时仍然可以在位置栏中显示完全可编辑、可复制和可粘贴的URL。 Apache(服务器) 我早期尝试测量Web浏览器中URL的最大长度时遇到了约4,000个字符的服务器URL长度限制,此后Apache会产生“413 Entity Too Large”错误。我使用了Red Hat Enterprise Linux 4中找到的最新Apache版本。官方Apache文档仅提到请求中单个字段的8,192字节限制。 Microsoft Internet Information Server 默认限制为16,384个字符(是的,微软的Web服务器接受比微软的Web浏览器更长的URL)。这是可配置的。 Perl HTTP :: Daemon(服务器) 最多可使用8,000个字节。使用Perl的HTTP :: Daemon模块构建Web应用程序服务器时,将遇到所有HTTP请求标头的组合大小的16,384字节限制。这不包括POST方法表单数据、文件上传等,但包括URL。实际上,当URL显着长于8,000个字符时,会导致413错误。可以轻松地消除此限制。查找Daemon.pm中所有16x1024出现的位置,并将它们替换为较大的值。当然,这会增加您面临拒绝服务攻击的风险。 建议 极长的URL通常是一个错误。超过2,000个字符的URL在大多数流行的Web浏览器中无法工作。如果您打算使您的网站适用于大多数互联网用户,请勿使用它们。
当您希望提交包含许多字段的表单时,否则会产生非常长的URL,标准解决方案是使用POST方法而不是GET方法:表单字段随后作为HTTP事务体的一部分传输,而不是URL的一部分,并且不受URL长度限制。短暂的信息不应存储在URL中。
作为一个经验法则,如果某个信息不需要在返回到收藏夹或书签时重新生成相同的页面,则它不属于URL。 书签问题 在非常罕见的情况下,将大量“状态”信息保留在URL中可能是有用的。例如,地图导航网站的用户可能希望将当前显示的地图添加到其“书签”或“收藏夹”列表中并稍后返回。如果您必须这样做,并且您的URL接近2000个字符的长度,请尽可能紧凑地表示信息,挤出尽可能多的“空气”。如果您的字段名称占用了太多空间,请改用固定字段顺序。挤出任何不真正需要被书签的字段。避免使用大的十进制数-只使用必要的精度,并考虑使用字母和数字的base-64表示(我没有说这很容易)。
在极端情况下,考虑使用gzip算法压缩您漂亮但过长的URL。然后,使用仅包含URL合法字符的base64重新编码二进制数据。这可以获得3-4倍的空间收益,但在下次访问时解压缩URL时需要一些CPU时间。再次强调,我从未说过这很容易!