43961


以下のようなクエリのあるURLついて。

**<http://blog.nogizaka46.com/karin.itou/?d=20180512>**  
例えば、クエリ(パラメータ？)を"?d=20180512"としたとき、挙動としては"?d=20180512"に対応したページが開かれます。  
次に、"?d=20180000"などの存在しない値を入力した場合、**<http://blog.nogizaka46.com/karin.itou/>**ここにリダイレクトされます。

このようなWEBサイトがあるとき、リダイレクトされる(ページが存在しない)場合はfalse,
リダイレクトされない(ページが存在する)場合はtrueを返すメソッドを作りたいです。

そこで、下記のようなコードを作成しました。

[code]

    require 'net/http'
    require 'uri'
    
    def url_exist?(uri)
      agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
      begin
        url = URI.parse(uri)
        Net::HTTP.new(url.host).get(url.path, {"User-Agent": agent})
      rescue
        return false
      else
        return true
      end
    end
    
    puts url_exist?("http://blog.nogizaka46.com/karin.itou/?d=20180512")
    puts url_exist?("http://blog.nogizaka46.com/karin.itou/?d=20180000")
    
[/code]

これだと、"?d=~"の値がどんなものでも、trueが返ってきてしまいました。  
リダイレクトした先のURLを取得する['location']も試してみたのですが、中身は空となってしまいます。

どうにかして、リダイレクト先のURLを取得するか、falseが取得できるようにしたいです。  
どのようにすればいいでしょうか？

お知恵をお貸しいただけると幸いです。


CC BY-SA 4.0
2018-05-13T13:15:11.663
43960
2018-05-13T15:38:29.660
27696
question
ruby
Ruby URL先のページが存在するか


質問に掲載のコードを実行するとどちらの場合も `200 OK`
が返されるでしょう。なぜなら、`get(url.path)`としているため実際のリクエストには指定のURLの`?`以降のクエリは含まれていないためです。(その為どちらも同じページをリクエストしています)

[code]

    Net::HTTP.new(url.host).get(url.path)
    
[/code]

を

[code]

    Net::HTTP.new(url.host).get(url.request_uri)
    
[/code]

で置き換えることでその問題は解決できるかと思います。

（もちろんどちらの場合も例外は投げられないのでそこだけ変えても意図した動作にはならないと思いますが、問題はそこのようです。）


CC BY-SA 4.0
2018-05-13T15:38:29.660
43961
2018-05-13T15:38:29.660
2376
43960
answer