현재 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
나는 약간의 상실감이 있으며 어떤 도움이나 생각이라도 감사 할 것입니다.