メインのドメイン+サブドメンで構成されるサイトを作っています。
Cookieのdomainでサブドメインも使えるようにすれば良さそうですが、開発環境がlocalhostゆえに単純ではなかったので、メモしておきます。

課題:Cookieのdomainに.localhostを指定しても効かない

下記のようにCookieのdomainを指定すれば終わりと思いきや、
ブラウザでログイン後にサブドメインに移動すると未ログイン状態になってしまう。
localhostは特別なドメインなので、普通のドメインと同じ使い方はできないという事らしい。

config/application.rb

    config.session_store :cookie_store, domain: '.localhost'

解決策:ドメインを変える

config/application.rb

    config.session_store :cookie_store, domain: Settings['base_domain']

config/settings/development.yml

base_domain: localhost.local

※config/settings/test.ymlとproduction.ymlにも設定

PCのhostsに下記を追加してアクセスしてみる。

$ sudo vi /etc/hosts
127.0.0.1	localhost.local
$ rails s
-> http://localhost.local:3000/

しかし、エラーに

Blocked host: localhost.local
To allow requests to localhost.local, add the following to your environment configuration:
config.hosts << “localhost.local”

Rails6からDNSリバインディングやHTTPヘッダ・インジェクション対策が入っているので、ホスト名を明示する必要がある。
DNSリバインディングは、ApacheやNginxで異なるホスト名でアクセスできないように設定してあげれば不要だが。

config/environments/development.rb
config/environments/test.rb

  config.hosts.clear

config/environments/production.rb

  config.hosts << ".#{Settings['base_domain']}"

developmentは、正確なドメイン(localhost.local)を指定しても挙動は問題ないが、
testは、既存のRSpecが通らなくなるし、やりたい事はこれではないので、clearで無視する事にしました。

【参考】ここまでのコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/0e1731babaf06d58fde1780a87b4b30cdee608d7

序でに、request.domainをFQDNと勘違いした件

http://localhost.local:3000/

request.domain = localhost.local

http://space.localhost.local:3000/

request.domain = localhost.local
request.subdomain = space
request.host = space.localhost.local

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です