복붙노트

[RUBY-ON-RAILS] 이상한 "406 허용되지"오류

RUBY-ON-RAILS

이상한 "406 허용되지"오류

나는 자바 스크립트를 통해이 작업을 명중 할 때, 나는 406 불가 오류가 발생합니다 :

  def show
    @annotation = Annotation.find_by_id(params[:id])

    respond_to do |format|
      format.html {
         if @annotation.blank?
           redirect_to root_path
         else
           redirect_to inline_annotation_path(@annotation)
         end
       }

       format.js {
         if params[:format] == "raw"
           render :text => @annotation.body.to_s
         else
           render :text => @annotation.body.to_html
         end
       }
    end
  end

이것은 jQuery를에서,하지만 난 오른쪽 beforeSend 물건을하고 있어요 :

  $.ajaxSetup({ 
    beforeSend: function(xhr) {
      xhr.setRequestHeader("Accept", "text/javascript");
    },
    cache: false 
  });

여기 내 요청 헤더는 다음과 같습니다

Host    localhost:3000
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
Accept  text/javascript
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  300
Connection  keep-alive
X-Requested-With    XMLHttpRequest
Content-Type    application/x-www-form-urlencoded

해결법

  1. ==============================

    1.나는 사건을 금!

    나는 사건을 금!

    나는 나 대신 HTML의 가격 인하 전송하는 서버를 이야기하기 위해 내 GET 요청이있는 형식 매개 변수를 전송했다. 여기 내 자바 스크립트는 다음과 같습니다

    $.get("/annotations/" + annotation_id, {format: 'raw'}, function(data) {
    });
    

    그리고 나는 format.js 블록이 매개 변수를 찾고 있었다 :

       format.js {
         if params[:format] == "raw"
           render :text => @annotation.body.to_s
         else
           render :text => @annotation.body.to_html
         end
       }
    

    하지만 분명히 형식 매개 변수는 respond_to 블록을 혼동한다. 에 {인하 '사실'} : 나는 { '원시'형식}에서 변경하고 그것을 작동합니다.

    나는이 레일의 버그 것 같다?

  2. ==============================

    2.당신의 respond_to 블록 "format.js"를 포함

    당신의 respond_to 블록 "format.js"를 포함

  3. ==============================

    3.아이폰 응용 프로그램에서 JSON 렌더링 웹 응용 프로그램에 연결 HTTPRiot 사용할 때 나에게 일어났다. 이 레일은 편안하게,가 잘이라고 HTTP 헤더를 수락 기대에 문제가 때문이라고 나타납니다. 따라서, 나는이었다 일한 어떤 경우에서 406없이 헤더가 작동 알기 위해 수락 문자열을 파이어 폭스의 LiveHTTPHeaders 확장을 사용 :

    아이폰 응용 프로그램에서 JSON 렌더링 웹 응용 프로그램에 연결 HTTPRiot 사용할 때 나에게 일어났다. 이 레일은 편안하게,가 잘이라고 HTTP 헤더를 수락 기대에 문제가 때문이라고 나타납니다. 따라서, 나는이었다 일한 어떤 경우에서 406없이 헤더가 작동 알기 위해 수락 문자열을 파이어 폭스의 LiveHTTPHeaders 확장을 사용 :

    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    

    내가 조사 할 또 다른 영역은 JSON 생산 컨트롤러입니다. 컨트롤러가 형식 지시자 누락 된 경우도 406 오류가 발생할 수 있음을, 그것이 응답 JSON을 반환 할 수 있습니다 지정합니다.

  4. ==============================

    4.jquery_ujs을 필요에 대한 귀하의 application.js 확인

    jquery_ujs을 필요에 대한 귀하의 application.js 확인

    //= require jquery_ujs
    
  5. ==============================

    5.당신은이 헤더를 수락 설정하지 않고 사용해 볼 수 있습니까? 실제로 심지어 수락 헤더없이 작동합니다.

    당신은이 헤더를 수락 설정하지 않고 사용해 볼 수 있습니까? 실제로 심지어 수락 헤더없이 작동합니다.

  6. ==============================

    6.그냥 컨트롤러 액션 메소드 형식 블록에이 코드를 사용 :

    그냥 컨트롤러 액션 메소드 형식 블록에이 코드를 사용 :

    format.js   { render :nothing => true }  
    
  7. ==============================

    7.당신이 jRails를 사용하는 경우이 나를 위해 많은 문제를 야기했다, 여기 내 application.js 파일입니다 :

    당신이 jRails를 사용하는 경우이 나를 위해 많은 문제를 야기했다, 여기 내 application.js 파일입니다 :

    $(document).ready(function () {
        $.ajaxSetup({
            beforeSend: function (xhr) {
                xhr.setRequestHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*");
            }
        });
    });
    
  8. ==============================

    8.이 아파치를 통해 제공됩니다? 당신은 보안 정책이 요청을 방해하는 경우 시나리오를 설명 http://forums.alwayswebhosting.com/showthread.php?p=8381 한 번 봐 걸릴 수도 있습니다.

    이 아파치를 통해 제공됩니다? 당신은 보안 정책이 요청을 방해하는 경우 시나리오를 설명 http://forums.alwayswebhosting.com/showthread.php?p=8381 한 번 봐 걸릴 수도 있습니다.

    편집 : 사이트가 취약하게 전체 사이트에 걸쳐 요청 스니핑 보안 정책 소등 옹호 위에서 언급 한 URL. URL에 규정되는 것입니다 htaccess로에서 Off로 SecFilterEngine 옵션을 설정, 문제의 원인에 만에 제로를 수행해야합니다. 그것은 장기적인 해결책으로 간주되어서는 안된다.

  9. ==============================

    9.제외 => [: 동작]이 미세이었다 before_filter 블록 나에게는 I가 첨가되면, JS 파일을 렌더링하는 동작을 제한하고 간단한 before_filter이었다.

    제외 => [: 동작]이 미세이었다 before_filter 블록 나에게는 I가 첨가되면, JS 파일을 렌더링하는 동작을 제한하고 간단한 before_filter이었다.

  10. ==============================

    10.내가 JS 형식에 대한 URL을 호출하지만 컨트롤러에이 있었다 :

    내가 JS 형식에 대한 URL을 호출하지만 컨트롤러에이 있었다 :

    respond_to do |format|
      format.html 
    end
    

    이 사파리에 벌금을했다,하지만 파이어 폭스.

    자연스럽게 내가 뭔가를 잃어버린,해야한다 :

    respond_to do |format|
      format.html
      format.js
    end
    

    지금은 두 브라우저는 정상입니다.

  11. ==============================

    11.내가 추가하는 것을 잊었다 때이 문제를 공격 : 원격 => 내 아약스 양식에 충실.

    내가 추가하는 것을 잊었다 때이 문제를 공격 : 원격 => 내 아약스 양식에 충실.

  12. ==============================

    12.당신이 form_for와 컨트롤러를 호출하면 또 다른 음험 한 "잡았다"는 여기에 실수로 추가-필요가 없습니다 매개 변수가 있습니다. 추가 매개 변수 형식의 요청으로 레일에 의해 해석 될 수있다, 당신은 (406)를 얻을 수 있습니다.

    당신이 form_for와 컨트롤러를 호출하면 또 다른 음험 한 "잡았다"는 여기에 실수로 추가-필요가 없습니다 매개 변수가 있습니다. 추가 매개 변수 형식의 요청으로 레일에 의해 해석 될 수있다, 당신은 (406)를 얻을 수 있습니다.

    예:

    = parking_permit form_for, URL : permit_group_parking_permits_path (@ permit_group.id, useless_id) 방법 : 어떻게해야합니까 | F | ...

    위의 예에서, 당신은 ROUTES 레이크하고 permit_group_parking_permits_path 아무것도하지만 permit_group ID가 필요하지 않습니다 결정 ...

    당신이 볼 경우 방법은 "0.1"당신의 팁 오프되도록 /model/action.1?blahblahblah으로 호출되는.

    이것은 우리가 한번이 지출 얼마나 많은 시간에 대해 이야기하지 않습니다 (406)으로 돌아갑니다.

  13. from https://stackoverflow.com/questions/1414446/weird-406-not-acceptable-error by cc-by-sa and MIT license