2011-05-07 84 views
1

我構建代理服務器,它工作得很好,但有一些網站他不能處理。 我試圖將問題減少到其核心,這就是我想到的: 我的測試用例是:http://bits.wikimedia.org/en.wikipedia.org/load.php 這是每個維基百科頁面中傳輸的http消息之一。 所以我試圖建立一個請求,並通過一個套接字發送這樣的:HTTP 1.1請求行

String request1 = 
    "GET http://bits.wikimedia.org/en.wikipedia.org/load.php HTTP/1.1" + 
    "\r\n" + 
    "Host: bits.wikimedia.org" + "\r\n" + 
    "User-Agent: MyHttpProxy/example.java (http://stackoverflow.com/q/5924490/319266)" + 
    "\r\n" + "\r\n"; 

但是我得到了404返回碼 - 因爲這個頁面確實存在這很奇怪! 我做的改掉了很多,並提出了新的要求這是隻有在請求行不同:

String request2 = 
    "GET /en.wikipedia.org/load.php HTTP/1.1" + 
    "\r\n" + 
    "Host: bits.wikimedia.org" + 
    "\r\n" + 
    "User-Agent: MyHttpProxy/example.java (http://stackoverflow.com/q/5924490/319266)" + 
    "\r\n" + "\r\n"; 

和它的工作!一個好的200帶回 一些不重要的內容(「/ *沒有模塊請求。最大讓我把這個在這裏* /」)

任何人都可以告訴我這裏有什麼問題嗎? 我看着RFC和我不能作出任何理由的這個...

Here是運行這個測試的源代碼,並打印resuls:

回答

4

您將提供請求行的完整URL只如果你要通過代理服務器。對Web服務器的直接請求需要遵循如您的示例中的request2的格式。

查看源代碼,您發送請求到端口80,這幾乎100%意味着他們沒有通過代理。我的猜測是你需要發送request1到端口8080或你的代理正在監聽的任何端口。

至於RFC,看看section 5.1.2。請注意,絕對路徑與代理服務器和源服務器的相對路徑一起使用。

+1

從技術上講,服務器應該接受絕對的語法,但許多服務器不會。 – EricLaw 2011-05-08 18:12:26

+0

嗨!首先感謝迴應。我怎麼知道我的請求是否通過服務器?假設我想製作一個「透明」的代理服務器,我如何知道我的請求是否會轉到代理服務器或直接轉到原始服務器?例如: 「http://www.youtube.com/watch?v=IytNBm8WA1c」以及上述內容。順便說一句:我沒有在stackoverflow 15點,因此我仍然不能標記答案爲useull(但它!) – talel 2011-05-09 04:42:03

+0

嗨。 如果您正在編寫透明代理服務器,那麼您無法在客戶端級別進行區分 - 這就是透明度的全部要點。在這種情況下,我的答覆大部分都不適用。 如果您自己編寫代理,那麼您應該在日誌中看到它是否看到請求。或者,您可以執行流量捕獲並查看對等IP是代理服務器還是源服務器。 – RomanK 2011-05-09 06:24:15

相關問題