1

현재 Rails 3.2.x 앱 몇 개를 실행 중입니다. 하나는 루비 1.9.x를 사용하고 API 엔드 포인트는 Rack-cors gem (1.0.1)입니다. - app Alice; 다른 하나는 swagger-ui_rails gem을 실행하며 api documentation - app app를 호스팅하는 앱입니다. Swagger 문서는 형식 버전 1.2를 실행하는 swagger-docs gem으로 만들어졌습니다. 어떤 이유로 든 Bob이 오류로 인해 Alice가 Bob에게 정보를 제공하지 못합니다.swagger-ui_rails의 생산 환경에서 랙 코어가 헤더를 표시하지 않습니다.

Failed to load https://alice.example.com/api-docs/v1/api-docs.json: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://bob.example.com:3000' is therefore not allowed access. 

그러나! 네트워크 탭을 보면 응답이 200이고 json 정보를 볼 수 있습니다. 그러나 응답 헤더에는 반드시 Access-Control-Allow-Origin 헤더가 필요하지 않습니다.

이것은 AWS Elastic Beanstalk (Bob은 EBS에서 호스팅 됨)와 로컬 (경계 된 주소 포함)을 통해 발생합니다. 나는 앨리스의 config/environments/development.rb이 코드가있을 때 콘솔에서 오류없이 예상대로

config.middleware.insert_before 0, 'Rack::Cors' do 
    allow do 
    origins ->(origin, env) do 
     Rails.logger.warn("CORS origin: #{origin}") 
     origin =~ /\.example\.com(:\d+)?\z/ 
    end 
    resource('*', :methods => [:get, :post, :options], :headers => :any) 
    end 
end 

, 로컬 호스트 커넥트와 자신감-UI가 나타납니다 : 앨리스의 내 config/environments/production.rb에서

, 나는 다음과 같은 있습니다. 크롬의 네트워크 탭에서

이 내가이 내가 밥 dev에있는 앨리스는 자극에있을 때 무엇을 얻을 것입니다

Access-Control-Allow-Methods:GET, POST, OPTIONS 
Access-Control-Allow-Origin:http://apitest.bob.com:3000 
Access-Control-Expose-Headers: 
Access-Control-Max-Age:1728000 
Content-Length:1499 
Content-Type:application/json 
Date:Fri, 22 Sep 2017 21:44:45 GMT 
Last-Modified:Mon, 28 Aug 2017 17:37:22 GMT 
Server: 
Vary:Origin 

로컬 (밥과 앨리스 DEV에서/로컬 호스트)가 무엇 : 당신이 볼 수 있듯이

Accept-Ranges:bytes 
Connection:keep-alive 
Content-Length:1500 
Content-Type:application/json 
Date:Fri, 22 Sep 2017 23:10:00 GMT 
ETag:"abc-559ce64fb8374" 
Last-Modified:Fri, 22 Sep 2017 22:04:35 GMT 
Server: 

는 자극 - 앨리스도 동일한 랙 고르 코드 블록, 헤더의 어떤 종류를 DEV-앨리스가하는 방법을 반환하지 않습니다.

rake middleware은 스택 맨 위에 Rack :: Cors를 표시하고 curl -i https://alice.example.com/api-docs/v1/api-docs.json은 로컬 및 Bob의 서버 모두에 대해 적절한 액세스 제어 헤더를 반환하지 않습니다.

prod-Bob에는 nginx에 요청 헤더와 메소드를 추가하는 EBS 확장 기능도 있습니다. 다른 SO 게시물에서는 레일스를 통해 직접 응답 헤더를 추가하는 사람들을 보았습니다. 따라서 Bob은 application_controller.rb (및 dev에 binding.pry를 사용하여 응답이 확실히 지정된 헤더를 가지고 있음을 확인할 수 있습니다)

after_filter :set_access_control_headers 

    def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = Rails.configuration.hostnames['headers'] 
    headers['Access-Control-Request-Methods'] = 'GET, PUT, POST, OPTIONS' 
    end 

나는 약간의 상실감이 있으며 어떤 도움이나 생각이라도 감사 할 것입니다.

답변

1

내가 사용하고있는 Swagger-docs gem은 내가 만든 .json 파일을 Rails의 /public 디렉토리에 넣습니다. 따라서 Rails는이를 랙 파일 시스템과 같은 정적 파일이 아닌 랙 파일로 간주합니다. production.rb 파일에 config.serve_static_assets = false이 있었기 때문에 모든 정적 파일은 웹 서버 (Apache/Nginx)의 책임이었고 랙 - 팰리스 보석의 책임이 아니라는 것을 의미했습니다.

일부 CORS 헤더를 Apache에 추가 한 후 swagger-ui가 적절하게로드되었지만 헤더가 두 배가되었습니다. Apache는 1 위, rack-cors는 2 위입니다.

나는했습니다 이후 제거 된 랙 고르 보석과 SO 와일드 카드 하위 도메인 관련 답변에 따라 앨리스에 설정 아파치 서버의 conf 조정 한 :

/등/아파치가/사이트 사용이/내 사이트는.conf

SetEnvIf Origin ^(https?://.+\.example\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1 
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN 
Header merge Vary "Origin" 
Header set "Access-Control-Allow-Methods" "GET, POST, OPTIONS" 
관련 문제