2011-05-07 2 views
1

나는 프록시 서버를 구축하고 훌륭하게 작동하지만 그는 처리 할 수없는 사이트가 있습니다. 문제를 핵심으로 줄이려고 시도한 결과, 다음과 같이 나타났습니다. 내 테스트 사례는 각 위키피디아 페이지에서 전송되는 http 메시지 중 하나 인 http://bits.wikimedia.org/en.wikipedia.org/load.php 입니다. 그래서 나는 그것을 위해 요청을 구축하고 같은 소켓을 통해 그것을 보내려고 : HTTP 1.1 request line

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를 쳐다 보면서 나는이 모든 이유를 만들 couldnt는 ...

Here이 테스트를 실행하기위한 소스 코드와 resuls 인쇄 :

답변

4

당신은 요청 줄에 전체 URL을 제공 할 만 프록시 서버를 통해가는 경우. 웹 서버에 대한 직접 요청은 예제에서 request2의 양식을 따라야합니다.

소스를 보면 거의 100 %가 프록시를 통과하지 못한다는 의미로 포트 80으로 요청을 보냅니다. 내 생각 엔 request1을 포트 8080이나 프록시가 수신 대기하는 포트로 보내야한다는 것입니다.

RFC의 경우 section 5.1.2을 살펴보십시오. 절대 경로는 프록시 및 원본 서버와의 상대 경로와 함께 사용됩니다.

+1

기술적으로 서버는 절대 구문을 허용하지만 많은 서버는이를 받아 들일 수 없습니다. – EricLaw

+0

안녕하세요. 우선 응답에 감사드립니다. 내 요청이 서버를 통과하는지 어떻게 알 수 있습니까? 내가 "투명한"프록시 서버를 만들고 싶다고 가정 해 봅시다. 어떻게하면 내 요청이 프록시로 보내지는지 또는 원산지로 직접 갈지를 알 수 있습니까? 예 : "http://www.youtube.com/watch?v=IytNBm8WA1c"및 위 내용을 참조하십시오. BTW : 나는 15 포인트를 stackoverflow 따라서 나는 여전히 useull로 답변을 표시 할 수 없다 (하지만 그것입니다!) – talel

+0

안녕. 투명한 프록시 서버를 작성하는 경우 실제로는 클라이언트 수준에서 구분할 수 없습니다. 투명성의 전체 요점입니다. 이 경우 대부분의 회신은 적용되지 않습니다. 프록시를 직접 작성하는 경우 로그에 요청을 보았는지 여부를 확인해야합니다. 또는 트래픽 캡처를 수행하여 피어 IP가 프록시 또는 원 서버 중 하나인지 확인할 수 있습니다. – RomanK

관련 문제