

rubyのopen-uriを使って、あるサイト内のページ内容を読み込もうとしていますが、  
403エラーになります（ブラウザからのアクセスは可能）。

[code]

    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
    
[/code]

開発は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は、以下の通りです。

[code]

    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'
    
[/code]

【追記】  
net/httpでの取得方法に変更したところ、コントローラに記載していると正常動作、遅延処理のためdelayed_jobで動作させようと、jobファイルに記載すると403エラーが出るようになりました。

[code]

    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")
    
[/code]

【追記】  
以下の方法でレスポンスヘッダとレスポンスボディを取得しました。  
varnish cache serverがエラーを返しているようですが、原因がわかりません。

[code]

    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)
    
[/code]

結果

[code]

    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>
    
[/code]


CC BY-SA 3.0
2018-02-01T15:56:38.660
41390
2018-03-26T06:57:25.973
2018-03-26T06:57:25.973
25787
25787
question
ruby-on-rails ruby
rubyのopen-uriで403エラー


エラーログにサブステータスコードが書かれていませんか？ログの中で"403"という文字列の近くを探してみてください。  
[■
IISのステータスコードは小数点つきという話](http://subtech.g.hatena.ne.jp/mayuki/20131120/1384901536)
のページにログの例があるので参考にしてください。

403エラー(<https://ja.wikipedia.org/wiki/HTTP_403>)のサブステータスコードが判るとエラーの原因を絞り込めます。


CC BY-SA 3.0
2018-02-02T01:33:33.163
41393
2018-02-07T00:36:37.307
2018-02-07T00:36:37.307
3060
217
41390
answer


何らかの理由で拒否されていますが、OpenURIでは例外発生時にレスポンスボディを取得できないので詳細はわかりません。プロキシなどのログにもレスポンスコードしか記載されないので同様です。

レスポンスボディに詳細が記載されている可能性がありますが、そのためにはOpenURIではなくnet/httpなどを使ったコードに書き換える必要があります。

サブステータスコードを確認、という回答がついていますが、IISの独自のものでログなどみてもわかりません。


CC BY-SA 3.0
2018-02-08T09:18:07.200
41578
2018-02-08T09:18:07.200
5793
41390
answer