2012-09-23 2 views
2

tinyproxy를 역 프록시로 사용하여 교차 사이트 아약스를 수행하려고합니다. 다음은 설정입니다 :프록시가 작동하지 않는 크로스 사이트 아약스

  • gentoo linux를 실행하는 데스크탑 시스템. IP 주소는 x.x.x.x입니다. Boa (웹 서버, 포트 80) 및 tinyproxy (http 프록시, 포트 8888)가이 시스템에서 실행 중입니다. 여기

테스트 파일입니다

======= a.html ======

<html> 
    <head> 
    <meta charset="UTF-8" /> 
    <title>Ajax test</title> 
    </head> 
    <body> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script> 
    <script type="text/javascript" src="a.js"></script> 
    </body> 
</html> 

======= a.js = http://x.x.x.x:8888/outside/http://www.outside.com/에 갈 수 있도록 =======

$(document).ready(function() { 

    function error_func() 
    { 
     alert("error occurred"); 
    } 

    function ajax_func(data) 
    { 
     alert("ajax received"); 
    } 

    $.get("http://x.x.x.x:8888/outside/xyz.txt", ajax_func).error(error_func); 

}); 

나는 tinyproxy를 구성했습니다. 그 도메인을 제어하고 그 안에 "test string"이라는 텍스트 파일 (xyz.txt)을 넣었습니다.

이제 firefox : x.x.x.x : 8888/xyz.txt에 다음 url을 넣으면 모든 것이 작동하고 브라우저 창에 "test string"이 표시됩니다. 하지만 파이어 폭스에 x.x.x.x/a.html을 넣을 때 "오류가 발생했습니다"라는 대화 상자가 나타납니다. 나는 IE, 사파리, 파이어 폭스, 그리고 크롬에서 이것을 시도했고 나는 그들 모두에서 "오류가 발생했다"대화 상자를 얻는다.

"동일한 출처 정책"을 알고 있으므로 그 한계를 극복하기 위해 tinyproxy를 사용하고 있습니다.

트래픽을보기 위해 gentoo Linux 시스템에서 wireshark를 사용했습니다. 모든 것이 괜찮아 보입니다. 파이어 폭스와 x.x.x.x 사이의 HTTP 트랜잭션을보고, x.x.x.x와 "외부"사이의 HTTP 트랜잭션과 x.x.x.x와 파이어 폭스 사이의 또 다른 HTTP 트랜잭션을 봅니다. HTTP 200 OK에는 "테스트 문자열"이 예상대로 포함되어 있습니다. 하지만 여전히 jquery가 행복하지 않고 "ajax received"대화 상자가 표시되지 않습니다 ...

한 가지 확실한 점은 HTTP "Server"헤더입니다. x.x.x.x 시스템에는 "Server : Boa"가 표시되지만 최종 응답에는 "Server : Apache"가 있습니다. 이 차이 때문에 동일한 기원 정책을 위반할 수 있습니까?

+0

BTW, 왜냐하면 내가 (shoutcast)와 함께 일할 실제 서버에서, 나는 아무런 통제력도없고 JSONP를 지원하지 않기 때문에 JSONP를 사용할 수 없다 모든 API에 대해 이것은 기본 테스트를 설정하기위한 간단한 테스트에 지나지 않습니다. 따라서 jquery를 사용하여 xyz.txt 파일을 검색 할 수 있다면 다음 단계는 동일한 메커니즘을 사용하여 XML 데이터를 검색하기 위해 shoutcast에 API 호출을하는 것입니다. –

+0

아마도 여기에 오타가 있지만 xxxx : 8888/xyz.txt'를 수동으로 테스트하고 javascript 파일에서'xxxx : 8888/outside/xyz.txt'를 입력하십시오. 그건 잘못이 아니지, 그렇지? – Roman

+0

안녕하세요 로마인, 예, 오타입니다 ... 전체 링크 (신규 사용자)를 추가 할 수 없어 주변에서 물건을 잘라내야했습니다. –

답변

0

동일 출처 정책은 액세스 제한 :

동일 출처 정책은 귀하의 경우에도 적용

  • 동일한 호스트
  • 같은 프로토콜
  • 동일한 포트를 당신 때문에 x.x.x.x:80에서 x.x.x.x:8888에 액세스 해보세요.

    동일한 포트에서도 콘텐츠를 제공해야합니다.통신 할 때

    1. 같은 호스트
    2. 같은 프로토콜
    3. 같은 포트 그래서 기술적으로

    당신은 Ajax 호출을 사용할 수 없습니다

+0

답변 해 주셔서 감사합니다. 어떤 아이디어가 들어오는 포트가 80 인 동일한 호스트에서 웹 서버와 http 프록시를 어떻게 실행할 수 있습니까? –

+0

@ user1692262 여러분의 서버 기술과 여러분의 요구에 달려 있습니다 ... PHP에서는'echo file_get_contents ('http://www.outside.com/');' – Roman

+0

과 같이 간단 할 수 있습니다. 불행하게도 타겟 시스템은 임베디드 보아를 웹 서버로 운영하는 시스템이며 cgi는 유일하게 사용할 수있는 기술입니다. 나는 C/C++ 개발에 정통하다. 따라서 최악의 경우 libcurl을 사용하여 shoutcast API 지원을 구현할 수있다. 하지만 임베디드 CPU는 이미 오버로드되어 있으므로 가능하면 클라이언트 PC CPU 사이클을 사용하여 모든 shoutcast API 작업을 수행하고 싶습니다. 나는 또한 웹 물건 (html, js, jquery)에 멍청하다. –

1

아약스 통신은이 세 가지 조건에서 이루어져야한다 서로 다른 포트 사이에 있지만 간단한 해결책이 있습니다. 다른 호스트/프로토콜/포트에서 액세스 할 수있는 Access-Control-Allow-Origin 헤더를 정의하면 사전 조건을 무시할 수 있습니다.

웹 페이지가 올바른 헤더를 통해 프록시에 액세스 할 수 있는지 확인해야합니다. 자세한 내용은

나는 당신이이 글을 읽을 제안 : 약 한달 전에

관련 문제