2011-10-24 13 views
0

這是一個#錨斷裂是有點怪異之一。我使用的是HTTPClient 4.1.2,它似乎只要發現URL中帶有'#'之類的東西,它就會完全獲得URL中的#。了HTTPClient - HTTP獲取與在重定向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發送一個get請求,URI的設置爲URI: /2011/10/jack-ma-alibaba-has-prepared-20-billion-to-acquire-yahoo/#.Tpw-xG61XjU.twitter,這導致服務器發回404頁面未找到。

查看IE,Firefox和cURL發送的GET,它們都從URI的末尾去掉#...,例如cURL GET請求URI被設置爲URI:/2011/10/jack-ma-alibaba-has-prepared-20-billion-to-acquire-yahoo/ - 所有# ...已被刪除。這是針對完全相同的條目URL http://stks.co/eWt

作爲測試,發送該原始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未找到結果。

所以,問題是是否有在了HTTPClient可以設置,使之類的東西尾隨#...可以自動從URL中移除任何設置。或者我會如何去手動刪除這些URL(記住我需要捕獲所有的重定向網址)?

+0

這將有助於HTTP。: //stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor –

+0

是的,我看到了這一點。但問題是我不知道,如果URL有一個錨#在它裏面,所有的UR Ls正在從一個簡短的URL服務中提供服務,這個簡短的URL服務將#anchor保留在URL中,並且HTTPClient盲目地從重定向301中獲取此信息,並嘗試獲取該頁面... – NightWolf

回答

1

這聽起來像他們的網絡服務器壞了。 URI規範說,數字符號(#)終止URI的路徑部分。如果Web服務器在路徑的#部分之後考慮任何內容,則它不遵循URI規範。

路徑組件包含數據,通常以分層的形式組織在一起,即,與非分層查詢組件數據一起,服務於URI的方案和命名授權的範圍(如果有的話)中確定的資源。路徑是由第一個問號(「?」)或數字符號(「#」)字符,或者通過URI年底終止。」 - RFC3986

我測試了幾個流行的Web服務器,它們都正確解析這些URI,忽略了數字符號後的部分

我沒有的解決方法,但任何好的建議,但至少現在你知道是誰的錯

+0

感謝大衛,這絕對是一個Web服務器的事情。但我們正在爬取一些網站(我確信有很多狗狗服務器)。所以一個簡單的解決方法可能是爲了。它似乎捲曲,IE瀏覽器和FF全部剝離出來,所以他們不需要擔心服務器內幕... – NightWolf

+0

我會建議修改HTTPClient源代碼。在調用您的代碼的重定向邏輯中添加一個鉤子,併爲其提供修改該URL的機會。我意識到這很醜陋,但你正在解決別人的問題。 –

0

注意:散列(和散列)之後的所有字符串都不會發送到服務器。 URL中的哈希值是用於瀏覽器而不是服務器的。

+0

嘗試了這一項。問題是它的重定向。這些URL來自一個簡短的/小型的URL服務和重定向,所以我不知道重定向URL是否會有一個#anchor或不是......我需要一種方法來捕獲重定向URL。同樣,它也是一個服務器特有的事情,它們如何處理URL中的#。這似乎是捲曲,IE和FF都剝離出來,所以他們不需要擔心服務器實現了一套... – NightWolf

+0

這將使路徑的數字符號部分之後的部分,創造了非常問題,他正試圖解決的問題。 –

+0

@NowWolf我認爲它會有一個錨點,但服務器會將其去掉。請參閱http:// tinyurl。com/68mkvcc – Mob