メインのドメイン+サブドメンで構成されるサイトを作っています。
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