복붙노트

[JQUERY] jQuery를 $ 아약스 (), $ .post 파이어 폭스에서 REQUEST_METHOD로 "옵션"을 전송

JQUERY

jQuery를 $ 아약스 (), $ .post 파이어 폭스에서 REQUEST_METHOD로 "옵션"을 전송

해결법


  1. 1.오류의 원인은 같은 기원 정책입니다. 그것은 단지 당신이 당신의 자신의 도메인에 대한 XMLHttpRequests를 수행 할 수 있습니다. 당신이 JSONP 콜백을 대신 사용할 수 있는지 확인 :

    오류의 원인은 같은 기원 정책입니다. 그것은 단지 당신이 당신의 자신의 도메인에 대한 XMLHttpRequests를 수행 할 수 있습니다. 당신이 JSONP 콜백을 대신 사용할 수 있는지 확인 :

    $.getJSON( 'http://<url>/api.php?callback=?', function ( data ) { alert ( data ); } );
    

  2. 2.나는 OPTIONS 요청 해석하고 필요한 액세스 제어 헤더를 설정하는 장고 측에 다음 코드를 사용했다. 이 후 파이어 폭스에서 내 크로스 도메인 요청 작업을 시작했다. 전에 말했듯이, 브라우저는 첫 번째 옵션은 POST 그 / GET 후 즉시 다음 요청 및 전송

    나는 OPTIONS 요청 해석하고 필요한 액세스 제어 헤더를 설정하는 장고 측에 다음 코드를 사용했다. 이 후 파이어 폭스에서 내 크로스 도메인 요청 작업을 시작했다. 전에 말했듯이, 브라우저는 첫 번째 옵션은 POST 그 / GET 후 즉시 다음 요청 및 전송

    def send_data(request):
        if request.method == "OPTIONS": 
            response = HttpResponse()
            response['Access-Control-Allow-Origin'] = '*'
            response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
            response['Access-Control-Max-Age'] = 1000
            # note that '*' is not valid for Access-Control-Allow-Headers
            response['Access-Control-Allow-Headers'] = 'origin, x-csrftoken, content-type, accept'
            return response
        if request.method == "POST":
            # ... 
    

    편집 : 어떤 경우에는 적어도 당신은 또한 실제 응답에 동일한 액세스 제어 헤더를 추가해야 할 것 같다. 이 요청이 성공하는 것 때문에 조금 혼란 스러울 수 있지만, 파이어 폭스는 자바 스크립트에 대한 응답의 내용을 전달하지 않습니다.


  3. 3.이 모질라 개발자 센터 기사는 다양한 크로스 도메인 요청 시나리오에 대해 설명합니다. 이 기사는 '응용 프로그램 / x-www-form-urlencoded를'의 콘텐츠 형식과 POST 요청 (NO '프리 플라이트'OPTIONS 요청)는 '간단한 요청'으로 전송되어야 함을 나타내는 것으로 보인다. 파이어 폭스는 OPTIONS 요청 보낸 내 POST가 해당 콘텐츠 형식으로 보내졌다하더라도, 그러나 발견했다.

    이 모질라 개발자 센터 기사는 다양한 크로스 도메인 요청 시나리오에 대해 설명합니다. 이 기사는 '응용 프로그램 / x-www-form-urlencoded를'의 콘텐츠 형식과 POST 요청 (NO '프리 플라이트'OPTIONS 요청)는 '간단한 요청'으로 전송되어야 함을 나타내는 것으로 보인다. 파이어 폭스는 OPTIONS 요청 보낸 내 POST가 해당 콘텐츠 형식으로 보내졌다하더라도, 그러나 발견했다.

    나는 옵션은 '*'에 '액세스 제어 - 허용 - 원산지'응답 헤더를 설정 서버에 핸들러를 요청 작성하여이 작업을 할 수 있었다. 당신은 'http://someurl.com'처럼 뭔가 특정로 설정하여보다 제한 될 수 있습니다. 또한, 나는 가정, 여러 기원의 쉼표로 구분 된 목록을 지정할 수 있습니다 읽었습니다,하지만 난 일이를 가져올 수 없습니다.

    파이어 폭스 OPTIONS에 응답이 허용 '액세스 제어 - 허용 출처'값을 요청 받으면, 상기 POST 요청을 보낸다.


  4. 4.나는 완전히-아파치 기반 솔루션을 사용하여이 문제를 해결했습니다. 내 가상 호스트 / htaccess로에서 나는 다음과 같은 블록을 넣어 :

    나는 완전히-아파치 기반 솔루션을 사용하여이 문제를 해결했습니다. 내 가상 호스트 / htaccess로에서 나는 다음과 같은 블록을 넣어 :

    # enable cross domain access control
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
    
    # force apache to return 200 without executing my scripts
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} OPTIONS
    RewriteRule .* / [R=200,L]
    

    당신은 아파치가 대상 스크립트를 실행하면 어떻게되는지에 따라, 후반이 필요하지 않을 수 있습니다. 신용 후반의 친절에 Serverfault 민속로 이동합니다.


  5. 5.응답 스크립트의 상단이 PHP가 작동하는 것 같다. (파이어 폭스 3.6.11으로. 아직 테스트의 많은 일을하지 않았습니다.)

    응답 스크립트의 상단이 PHP가 작동하는 것 같다. (파이어 폭스 3.6.11으로. 아직 테스트의 많은 일을하지 않았습니다.)

    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    if(array_key_exists('HTTP_ACCESS_CONTROL_REQUEST_HEADERS', $_SERVER)) {
        header('Access-Control-Allow-Headers: '
               . $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']);
    } else {
        header('Access-Control-Allow-Headers: *');
    }
    
    if("OPTIONS" == $_SERVER['REQUEST_METHOD']) {
        exit(0);
    }
    

  6. 6."JSONP"dataType와 사용 데이터 유형에 대한 - 나는지도를 Google에 요청을 전송과 같은 문제가 있고, 해결책은 jQuery를 1.5 매우 간단합니다

    "JSONP"dataType와 사용 데이터 유형에 대한 - 나는지도를 Google에 요청을 전송과 같은 문제가 있고, 해결책은 jQuery를 1.5 매우 간단합니다


  7. 7.범죄자 OPTIONS 방법을 사용하여 요청을 인 플라이트

    범죄자 OPTIONS 방법을 사용하여 요청을 인 플라이트

    (GET 이외의 방법, 또는 특정 MIME 유형과 POST 사용을 위해 HTTP를 위해, 특히) 사용자 데이터에 부작용을 일으킬 수 HTTP 요청 방법, 브라우저 "프리 플라이트"요청의에서 방법을 지원 유혹하는 사양 의무에 대한 실제 HTTP 요청 방법 실제 요청을 보내는 서버에서 "승인"에 따라 다음의 HTTP OPTIONS 요청 방법 및와 서버.

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS : 웹 참조 사양

    내가 Nginx에의 conf에 다음 행을 추가하여 문제를 해결.

        location / {
                   if ($request_method = OPTIONS ) {
                       add_header Access-Control-Allow-Origin  "*";
                       add_header Access-Control-Allow-Methods "POST, GET, PUT, UPDATE, DELETE, OPTIONS";
                       add_header Access-Control-Allow-Headers "Authorization";
                       add_header Access-Control-Allow-Credentials  "true";
                       add_header Content-Length 0;
                       add_header Content-Type text/plain;
                       return 200;
                   }
        location ~ ^/(xxxx)$ {
                    if ($request_method = OPTIONS) {
                        rewrite ^(.*)$ / last;
                    }
        }
    

  8. 8.JSONP를 사용할 때 소스 1.3.2를 통해보고 된, 요청은 브라우저 같은 도메인 정책이 바뀌지하는 동적으로 SCRIPT 요소를 구축하여 이루어진다. 당연히, 당신이 SCRIPT 요소를 사용하여 POST 요청을 할 수 없습니다, 브라우저는 GET을 사용하여 결과를 가져올 것입니다.

    JSONP를 사용할 때 소스 1.3.2를 통해보고 된, 요청은 브라우저 같은 도메인 정책이 바뀌지하는 동적으로 SCRIPT 요소를 구축하여 이루어진다. 당연히, 당신이 SCRIPT 요소를 사용하여 POST 요청을 할 수 없습니다, 브라우저는 GET을 사용하여 결과를 가져올 것입니다.

    당신이 JSONP 호출을 요청하는 것처럼, SCRIPT 요소는 AJAX 호출의 유형이 GET으로 설정된 경우에만이 작업을 수행하기 때문에, 생성되지 않습니다.

    http://dev.jquery.com/ticket/4690


  9. 9.우리는 ASP.Net이 같은 문제가 있었다. JQuery와 $는 PageHandlerFactory 만, HEAD, POST, DEBUG 동사를 GET 응답에 제한되었다 때문에 약간의 HTML 콘텐츠를 얻을 수 .post 실행하려고 할 때 우리의 IIS는 내부 서버 오류를 반환했습니다. 당신이 목록에 동사 "옵션"을 추가하거나 선택이 제한을 변경할 수 있도록 "모든 동사"

    우리는 ASP.Net이 같은 문제가 있었다. JQuery와 $는 PageHandlerFactory 만, HEAD, POST, DEBUG 동사를 GET 응답에 제한되었다 때문에 약간의 HTML 콘텐츠를 얻을 수 .post 실행하려고 할 때 우리의 IIS는 내부 서버 오류를 반환했습니다. 당신이 목록에 동사 "옵션"을 추가하거나 선택이 제한을 변경할 수 있도록 "모든 동사"

    당신은 당신의 IIS 관리자에서 다음 처리기 매핑, (우리는 프레임 워크 4.0 통합 응용 프로그램 풀을 사용하는) 당신이 필요로 * .apx 파일에 대한 PageHandlerFactory에서 더블 클릭을 선택, 당신의 웹 사이트를 선택하는 것이 수정할 수 있습니다. 다음 동사의 TaBN으로 이동하여 수정을 적용, 요청 제한을 클릭합니다.

    이제 우리의 $ .post 요청은 예상대로 작동 :)


  10. 10.양식의 액션 URL은 도메인의 www가 일부 포함되어있는 경우는 연 원래의 페이지는 www를 볼 때, 확인하십시오.

    양식의 액션 URL은 도메인의 www가 일부 포함되어있는 경우는 연 원래의 페이지는 www를 볼 때, 확인하십시오.

    일반적으로 정식 URL에 다 ..

    이 기사에 걸림돌 전에 시간 동안 고생과 크로스 도메인의 힌트를 발견했다.


  11. 11.나는 o.url = 'index.php를'이 파일이 존재하는지 확인하고 콘솔에 성공 메시지를 반환 것으로 보인다. 내가 URL을 사용하는 경우 그것은 오류를 반환합니다 : HTTP : //www.google.com 페이지

    나는 o.url = 'index.php를'이 파일이 존재하는지 확인하고 콘솔에 성공 메시지를 반환 것으로 보인다. 내가 URL을 사용하는 경우 그것은 오류를 반환합니다 : HTTP : //www.google.com 페이지

    직접 $ .post 방법을 사용하지 않는 이유는 POST 요청을하는 경우 :

    $.post("test.php", { func: "getNameAndTime" },
        function(data){
            alert(data.name); // John
            console.log(data.time); //  2pm
        }, "json");
    

    그것은 훨씬 더 간단합니다.


  12. 12.나는 도메인의 서버 코드는 당신이에 게시하는 제어 경우이 문제를 해결하는 방법의 명확한 예를 기록했다. 이 답변이 스레드에 감동, 그러나 이것은 더 명확하게 IMO을 설명한다.

    나는 도메인의 서버 코드는 당신이에 게시하는 제어 경우이 문제를 해결하는 방법의 명확한 예를 기록했다. 이 답변이 스레드에 감동, 그러나 이것은 더 명확하게 IMO을 설명한다.

    어떻게 자바 스크립트를 통해 도메인 간 POST 요청을 보내려면 어떻게합니까?


  13. 13.이에 대한 해결 방법은 다음과 같습니다

    이에 대한 해결 방법은 다음과 같습니다

    이 페이스 북의 API를 호출에와 파이어 폭스와 함께 일했다. 방화범 대신 위의 조건 (둘 다)와 옵션의 GET을 사용하고 있습니다.


  14. 14.문제를 회피하는 또 다른 가능성은 프록시 스크립트를 사용하는 것입니다. 그 방법은, 여기에 예를 들어 설명한다

    문제를 회피하는 또 다른 가능성은 프록시 스크립트를 사용하는 것입니다. 그 방법은, 여기에 예를 들어 설명한다


  15. 15.당신은없이 시도 할 수 있습니다

    당신은없이 시도 할 수 있습니다

    의 contentType : 응용 프로그램 / x-www-form-urlencoded를


  16. 16.옵션을 추가하십시오 :

    옵션을 추가하십시오 :

    dataType와 "JSON"


  17. 17.

     function test_success(page,name,id,divname,str)
    { 
     var dropdownIndex = document.getElementById(name).selectedIndex;
     var dropdownValue = document.getElementById(name)[dropdownIndex].value;
     var params='&'+id+'='+dropdownValue+'&'+str;
     //makerequest_sp(url, params, divid1);
    
     $.ajax({
        url: page,
        type: "post",
        data: params,
        // callback handler that will be called on success
        success: function(response, textStatus, jqXHR){
            // log a message to the console
            document.getElementById(divname).innerHTML = response;
    
            var retname = 'n_district';
            var dropdownIndex = document.getElementById(retname).selectedIndex;
            var dropdownValue = document.getElementById(retname)[dropdownIndex].value;
            if(dropdownValue >0)
            {
                //alert(dropdownValue);
                document.getElementById('inputname').value = dropdownValue;
            }
            else
            {
                document.getElementById('inputname').value = "00";
            }
            return;
            url2=page2; 
            var params2 = parrams2+'&';
            makerequest_sp(url2, params2, divid2);
    
         }
    });         
    }
    

  18. 18.나는 페이스 북의 API를 사용하려고 시도와 비슷한 문제가 있었다.

    나는 페이스 북의 API를 사용하려고 시도와 비슷한 문제가 있었다.

    Preflighted 요청을 전송하지 않은 유일한 contentType이 여기에 모질라에서 언급 된 매개 변수의 단지 텍스트 / 일반 없습니다 ... 나머지 될 듯

    참고 : 상기의 모즈의 문서 그것은 ... X-로리 헤더가 Preflighted 요청을 트리거해야하지 않습니다 제안합니다.


  19. 19.당신은 서버 측에서 몇 가지 작업을 수행해야합니다. 난 당신이 서버 측에서 PHP를 사용하고 볼 수 있지만 .NET 웹 응용 프로그램을위한 솔루션은 여기에 있습니다 : '응용 프로그램 / JSON'에서 jQuery.ajax에 콘텐츠 형식을 설정할 수 없습니다

    당신은 서버 측에서 몇 가지 작업을 수행해야합니다. 난 당신이 서버 측에서 PHP를 사용하고 볼 수 있지만 .NET 웹 응용 프로그램을위한 솔루션은 여기에 있습니다 : '응용 프로그램 / JSON'에서 jQuery.ajax에 콘텐츠 형식을 설정할 수 없습니다

    PHP 스크립트에서 동일한 작업을 수행하고 그것은 작동합니다. 간단히 : 같은 종류와 두 번째 요청과 같은 데이터를 송신 할 수있는 경우 첫 번째 요청 브라우저에서 서버에 요청하는 것은 적절한 것입니다 / 허용했다.


  20. 20.다음을 추가하십시오 :

    다음을 추가하십시오 :

    dataType: "json",
    ContentType: "application/json",
    data: JSON.stringify({"method":"getStates", "program":"EXPLORE"}),  
    

  21. 21.내가 다른 서버에서 호스팅 내 아파치 SOLR에 데이터를 게시 할 때 비슷한 문제를 해결하기 위해 프록시 URL을 사용했다. (이 완벽한 해답이 될 수 없습니다 그러나 내 문제를 해결합니다.)

    내가 다른 서버에서 호스팅 내 아파치 SOLR에 데이터를 게시 할 때 비슷한 문제를 해결하기 위해 프록시 URL을 사용했다. (이 완벽한 해답이 될 수 없습니다 그러나 내 문제를 해결합니다.)

    이 URL을 따르 프록시에 모드 - 재 작성을 사용하여, 나는 내 httpd.conf 파일에 다음 행을 추가합니다 :

     RewriteRule ^solr/(.*)$ http://ip:8983/solr$1 [P]
    

    따라서, 내가 할 수있는 단지 포스트 데이터 / SOLR http 대신에 데이터를 게시하는 : // IP : 8983 / SOLR / *. 그런 다음 같은 기원에 데이터를 게시됩니다.


  22. 22.난 이미 PHP를 잘 내 고르 상황을 처리하는 코드를 가지고 :

    난 이미 PHP를 잘 내 고르 상황을 처리하는 코드를 가지고 :

    header( 'Access-Control-Allow-Origin: '.CMSConfig::ALLOW_DOMAIN );
    header( 'Access-Control-Allow-Headers: '.CMSConfig::ALLOW_DOMAIN );
    header( 'Access-Control-Allow-Credentials: true' );
    

    그리고 그것은 때 원격 업로드 로컬 및 원격으로 잘 작동하지만,되지 않았습니다.

    뭔가 당신이 옵션을 요청할 때 고르 규칙을 내 헤더를 반환하지만 302, 결과적으로 그것을 검색 할 귀찮게하지 않았다, 아파치 / PHP는 또는 내 코드와 함께 발생합니다. 따라서 브라우저가 허용되는 상황으로 인식하지 않습니다.

    내가 @ 마크 맥도날드의 답변에 따라, 무슨 짓을, 내 헤더 다음에이 코드를 넣어 :

    if( $_SERVER['REQUEST_METHOD'] === 'OPTIONS' )
    {
        header("HTTP/1.1 202 Accepted");
        exit;
    }
    

    옵션을 요청할 때 지금, 그것은 단지 헤더 (202) 결과를 보내드립니다.


  23. 23.명심하시기 바랍니다:

    명심하시기 바랍니다:

    JSONP는 오직 GET 요청 방식을 지원합니다.

    * 파이어 폭스로 보내기 요청 : *

    $.ajax({
       type: 'POST',//<<===
       contentType: 'application/json',
       url: url,
       dataType: "json"//<<=============
        ...
    });
    

    옵션의 요청에 보내기 위 (잠시 ==> 유형 : 'POST') !!

    $.ajax({
        type: 'POST',//<<===
        contentType: 'application/json',
        url: url,
        dataType: "jsonp"//<<==============
        ...
    });
    

    그러나 GET 이상 요청 전송 (== 동안> 유형 : 'POST') !!

    당신이 "크로스 도메인 통신", 임금의 관심과에있을 때주의하십시오.

  24. from https://stackoverflow.com/questions/1099787/jquery-ajax-post-sending-options-as-request-method-in-firefox by cc-by-sa and MIT license