2011-10-24 2 views
0

이것은 약간 이상한 것입니다. 나는 HTTPClient 4.1.2를 사용하고 있는데, URL에 '#'과 같은 URL이있을 때마다 URL에서 #과 함께 전체를 얻는다.HTTPClient - 리디렉션 URL에 # 앵커가있는 HTTP GET이 깨졌습니다.

예를 들어 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으로 설정된 요청을 보내 서버가 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 찾을 수없는 결과가 나타납니다.

그래서 문제는 URL 클라이언트에서 후행 # ... 같은 항목을 자동으로 제거 할 수 있도록 설정할 수있는 HTTPClient의 설정입니다. 또는 URL에서 수동으로 제거하는 방법 (모든 리디렉션 URL도 캡처해야 함)

+0

.. : //stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor –

+0

그래, 이걸 봤어.하지만 문제는 URL에 # 앵커가 있는지 모른다는 것이다. 모든 UR Ls는 짧은 URL 서비스에서오고 있습니다.이 짧은 URL 서비스는 URL에 #anchor를 유지하고 HTTPClient는 맹목적으로 리디렉션 301에서이를 가져 와서 페이지를 가져 오려고 시도합니다. – NightWolf

답변

1

웹 서버가 고장난 것 같습니다. URI 스펙은 숫자 기호 (#)가 URI의 경로 부분을 종료 함을 나타냅니다. 웹 서버가 경로의 # 부분 이후에 아무것도 고려하지 않으면 URI 사양을 따르지 않습니다.

경로 구성 요소에는 일반적으로 계층 적 형식으로 구성된 데이터가 포함되어 있으며 비 계층 적 쿼리 구성 요소의 데이터와 함께 URI 구성표 및 명명 기관 (있는 경우) 범위 내의 리소스를 식별하는 역할을합니다. .

RFC3986 내가 몇 가지 인기있는 웹 서버를 테스트하고, -. 경로는 "첫 번째 물음표 ("? ") 또는 숫자 기호 ("# ") 문자에 의해 또는 URI의 말에 종료 . 그들은 모두

그래도 난 해결을위한 좋은 제안이없는 숫자 기호 뒤에 부분을 무시하고, 제대로이 URI를 구문 분석하지만, 적어도 지금은 책임이 누구인지이 HTTP를 도울 수

+0

David 님, 이것은 확실히 웹 서버 문제입니다. 그러나 우리는 다수의 사이트를 크롤링하고 있습니다 (모두 나는 많은 강아지 서버를 가지고 있습니다). 따라서 간단한 작업을 순서대로 수행 할 수 있습니다. cURL, IE 및 FF는 모두 서버 스트립에 대해 걱정할 필요가 없으므로 다음과 같이 나타납니다. – NightWolf

+0

HTTPClient 소스 코드를 수정하는 것이 좋습니다. 코드를 호출하는 리디렉션 로직에 훅을 추가하고 URL을 수정할 기회를 제공합니다. 나는 못 생겼다는 것을 알지만, 당신은 다른 누군가의 문제를 해결하려고 노력하고 있습니다. –

0

참고 : 해시 (및 해시) 이후의 모든 문자열은 서버로 보내지 않습니다. URL의 해시는 브라우저가 서버가 아닌 서버와 작동하도록되어 있습니다.

+0

이 (가) 시도했습니다. 문제는 리디렉션입니다. URL은 짧은/작은 URL 서비스에서 왔고 리디렉션되므로 리디렉션 URL에 #anchor가 있는지 여부는 알 수 없습니다. 리디렉션 URL도 캡처해야합니다. 또한 URL에서 #을 처리하는 방법과 관련하여 서버 관련 사항이 많습니다. cURL, IE 및 FF는 모두 서버 스트립에 대해 걱정할 필요가 없으므로 다음과 같이 나타납니다. – NightWolf

+0

그러면 경로의 숫자 기호 부분 이후에 부분을 만들어 문제를 해결하려고합니다. –

+0

@NightWolf 저는 앵커가있을 것이라고 생각하지만, 서버는 그것을 제거 할 것입니다. http : // tinyurl을 참조하십시오.com/68mkvcc – Mob

관련 문제