【问题标题】:HTTPClient - HTTP GETs broken with a # anchor in a redirect URLHTTPClient - HTTP GET 被重定向 URL 中的 # 锚点破坏
【发布时间】:2011-10-24 03:03:18
【问题描述】:

这有点奇怪。我正在使用 HTTPClient 4.1.2,似乎每当它找到带有“#”之类的 URL 时,它都会使用 URL 中的 # 进行完整获取。

例如,尝试获取 URL http://stks.co/eWt 将重定向到 URL http://news.ichinastock.com/2011/10/jack-ma-alibaba-has-prepared-20-billion-to-acquire-yahoo/#.Tpw-xG61XjU.twitter。现在这个 URL 是活动的,但问题是 HTTPClient 发送一个将 URI 设置为 URI: /2011/10/jack-ma-alibaba-has-prepared-20-billion-to-acquire-yahoo/#.Tpw-xG61XjU.twitter 的 get 请求,这导致服务器发回一个 404 页面未找到。

查看 IE、Firefox 和 cURL 发送的 GET,它们都将 URI 末尾的 #... #... 已被删除。这是与http://stks.co/eWt 完全相同的条目URL。

作为测试,将这个原始 URL 发送到 HTTPClient(即HttpGet httpget = new HttpGet("http://news.ichinastock.com/2011/10/jack-ma-alibaba-has-prepared-20-billion-to-acquire-yahoo/#.Tpw-xG61XjU.twitter");)会给出相同的 404 not found 结果。

所以问题是 HTTPClient 中是否有任何设置可以设置,以便可以从 URL 中自动删除尾随 #... 之类的内容。或者我将如何从 URL 中手动删除它(请记住,我还需要捕获所有重定向 URL)?

【问题讨论】:

  • 是的,我看到了这个。但问题是我不知道 URL 中是否有 # 锚点。所有的 URL 都来自一个短 URL 服务,这个短 URL 服务将 #anchor 保留在 URL 中,而 HTTPClient 盲目地从重定向 301 中获取它并尝试获取页面...

标签: java httpclient http-get


【解决方案1】:

听起来他们的网络服务器坏了。 URI 规范说数字符号 (#) 终止 URI 的路径部分。如果 Web 服务器在路径的 # 部分之后考虑任何内容,则它不遵循 URI 规范。

路径组件包含通常以分层形式组织的数据,这些数据与非分层查询组件中的数据一起用于标识 URI 方案和命名权限(如果有)范围内的资源。路径以第一个问号 ("?") 或数字符号 ("#") 字符结尾,或者以 URI 结尾。" - RFC3986

我测试了一些流行的网络服务器,它们都正确解析了这些 URI,忽略了数字符号后面的部分。

不过,对于解决方法,我没有任何好的建议。但至少现在你知道该怪谁了。

【讨论】:

  • 谢谢大卫,这绝对是一个网络服务器的事情。但是我们正在爬取一些网站(我确信所有这些网站都有大量的小狗服务器)。因此,可能需要一个简单的解决方法。似乎 cURL、IE 和 FF 都将其剥离,因此他们无需担心服务器 impl ...
  • 我建议修改 HTTPClient 源代码。在重定向逻辑中添加一个挂钩,它会在其中调用您的代码并使其有机会修改 URL。我知道这很丑,但你正在解决别人的问题。
【解决方案2】:

注意:散列(和散列)之后的所有字符串都不会发送到服务器。 URL 中的哈希是供浏览器使用的,而不是供服务器使用的。

【讨论】:

  • 试过这个。问题是它的重定向。这些 URL 来自一个短/微小的 URL 服务和重定向,所以我不知道重定向 URL 中是否会有 #anchor ......我还需要一种方法来捕获重定向 URL。关于它们如何处理 URL 中的 # ,这也是服务器特定的事情。似乎 cURL、IE 和 FF 都将其剥离,因此他们无需担心服务器 impl ...
  • 这将使数字符号之后的部分成为路径的一部分,从而产生他试图解决的问题。
  • @NightWolf 我认为它会有一个锚点,但服务器会将其剥离。见tinyurl.com/68mkvcc
  • 可以说 # 锚点对于发送到 Web 服务器是无效的,因此可以说一种让 HTTPClient 处理此问题的方法(删除锚点)会有所帮助...
  • URL 编码 # 有什么帮助?什么时候不应该发送?并且服务器无法识别它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多