localhost以外のホスト名でローカル環境のRailsに接続する方法

Ruby

http://localhost:3000で立ち上がっているローカル環境のRailsアプリケーションへ、任意のホスト名でアクセスできるようにする方法について紹介します。
今回は例としてhttp://api.local.example-dev.com:3000でアクセスできるように変更します。

検証環境のバージョンはRails 7.0.1、Ruby 3.1.0です。

任意のホスト名でローカル環境のRailsにアクセスするためにやること

以下の2つを変更する必要があります。

  • ローカル環境の『/etc/hosts』を編集する
  • Railsの『config/environments/development.rb』を編集する

ローカル環境の『/etc/hosts』を編集する

localhost127.0.0.1を指すホスト名です。
localhost以外のホスト名をローカル環境で利用する場合はホスト名を127.0.0.1にマッピングします。

/etc/hosts

# 以下を追加する
127.0.0.1   api.local.example-dev.com

Railsの『config/environments/development.rb』を編集する

Rails 6以降1、DNSリバインディング攻撃からの保護のためデフォルトでは.localhost0.0.0.0::からのアクセスのみ許可されています。
ですので、config/environments/development.rbを編集してリクエストの許可対象にホスト名を追加します。

config/environments/development.rb

Rails.application.configure do
  (略)
  ### 以下を追加
  config.hosts << "api.local.example-dev.com"

end

以下のように設定が読み込まれていればOKです。

$ rails c

### "api.local.example-dev.com"が追加されていればOK
> Rails.application.config.hosts
=> [".localhost", #<IPAddr: IPv4:0.0.0.0/0.0.0.0>, #<IPAddr: IPv6:0000:0000:0000:0000:0000:0000:0000:0000/0000:0000:0000:0000:0000:0000:0000:0000>, "api.local.example-dev.com"]

なお、上記の設定をしていない場合、http://api.local.example-dev.com:3000でRailsアプリケーションにアクセスするとBlocked host: api.local.example-dev.comというエラーが発生します。

Blocked hostエラーを防ぐには、今回紹介した『ホストをリクエスト許可に追加する方法』以外に『config.hosts.clearを設定する方法』『ActionDispatch::HostAuthorization middlewareを使わないようにする方法』があります。2

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考資料