rubyのopen-uriで403エラー
rubyのopen-uriを使って、あるサイト内のページ内容を読み込もうとしていますが、
403エラーになります(ブラウザからのアクセスは可能)。
url = "https://www.hogehoge.jp"
opt = {}
opt['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
opt['ssl_verify_mode'] = 'OpenSSL::SSL::VERIFY_NONE'
opt['Accept-Encoding'] = 'deflate'
opt['Accept-Language'] = 'ja,en-US;q=0.9,en;q=0.8'
page = open(url, opt).read
開発はcloud9、本番環境はawsのlightsailです。
開発中に403エラーが出た際、cloud9が海外IPのためではと考え、
国内の自前サーバにsquidを使ってproxyサーバを設置し、それを通してアクセスしたところ、
問題なく接続できました。
しかし、capistranoを使ってlightsailにデプロイしたところ、403エラーとなってしまいます。
lightsailの環境変数にも同じproxyを設定しています。
アプリの内容はもちろん、アクセス元のIPやhttpヘッダは同じはずなのに、
一方のみ403エラーとなり、原因が全く思いつきません。
よろしくお願いいたします。
【追記】
ブラウザの表示は、
We're sorry, but something went wrong.
If you are the application owner check the logs for more information.
のよく出るやつです。
production.logは、以下の通りです。
I, [2018-02-02T12:46:56.074182 #2970] INFO -- : Started GET "/xxxx/getdata" for xxx.xxx.xxx.xxx at 2018-02-02 12:46:56 +0900
I, [2018-02-02T12:46:56.075338 #2970] INFO -- : Processing by xxxxController#getdata as HTML
I, [2018-02-02T12:46:56.267191 #2970] INFO -- : Completed 500 Internal Server Error in 192ms (ActiveRecord: 0.0ms)
F, [2018-02-02T12:46:56.267782 #2970] FATAL -- :
F, [2018-02-02T12:46:56.267829 #2970] FATAL -- : OpenURI::HTTPError (403 Forbidden):
F, [2018-02-02T12:46:56.267853 #2970] FATAL -- :
F, [2018-02-02T12:46:56.267881 #2970] FATAL -- : app/controllers/xxx_controller.rb:25:in `getdata'
【追記】
net/httpでの取得方法に変更したところ、コントローラに記載していると正常動作、遅延処理のためdelayed_jobで動作させようと、jobファイルに記載すると403エラーが出るようになりました。
parsed_url = URI.parse('https://www.hogehoge.jp')
https = Net::HTTP.new(parsed_url.host, parsed_url.port)
https.use_ssl = true
req = Net::HTTP::Get.new(parsed_url.request_uri)
res = https.start do |x|
x.request(req)
end
page = res.body.force_encoding("UTF-8")
【追記】
以下の方法でレスポンスヘッダとレスポンスボディを取得しました。
varnish cache serverがエラーを返しているようですが、原因がわかりません。
logger.error("*****response header*******")
res.each_header do | name, val |
logger.error("name=#{name}, val=#{val}")
end
page = res.body.force_encoding("UTF-8")
logger.error("******page********")
logger.error(page)
結果
E, [2018-03-26T15:35:43.256675 #8988] ERROR -- : *****response code*******
E, [2018-03-26T15:35:43.256720 #8988] ERROR -- : 403
E, [2018-03-26T15:35:43.256742 #8988] ERROR -- : *****response header*******
E, [2018-03-26T15:35:43.256766 #8988] ERROR -- : name=server, val=Varnish
E, [2018-03-26T15:35:43.256785 #8988] ERROR -- : name=retry-after, val=0
E, [2018-03-26T15:35:43.256803 #8988] ERROR -- : name=content-type, val=text/html; charset=utf-8
E, [2018-03-26T15:35:43.256819 #8988] ERROR -- : name=content-length, val=421
E, [2018-03-26T15:35:43.256836 #8988] ERROR -- : name=accept-ranges, val=bytes
E, [2018-03-26T15:35:43.256857 #8988] ERROR -- : name=date, val=Mon, 26 Mar 2018 06:32:14 GMT
E, [2018-03-26T15:35:43.256876 #8988] ERROR -- : name=via, val=1.1 varnish
E, [2018-03-26T15:35:43.256893 #8988] ERROR -- : name=connection, val=close
E, [2018-03-26T15:35:43.256909 #8988] ERROR -- : name=x-served-by, val=cache-nrt6149-NRT
E, [2018-03-26T15:35:43.257132 #8988] ERROR -- : name=x-cache, val=MISS
E, [2018-03-26T15:35:43.257152 #8988] ERROR -- : name=x-cache-hits, val=0
E, [2018-03-26T15:35:43.257168 #8988] ERROR -- : name=x-timer, val=S1522045935.830867,VS0,VE0
E, [2018-03-26T15:35:43.257185 #8988] ERROR -- : ******page********
E, [2018-03-26T15:35:43.257201 #8988] ERROR -- :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<h1>Error 403 Forbidden</h1>
<p>Forbidden</p>
<h3>Guru Mediation:</h3>
<p>Details: cache-nrt6149-NRT 1522045935 1982824828</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>