Railsでrequest.urlとrequest.original_urlの違い

スポンサーリンク

Rails で request.url と request.original_url の違いが気になって、ActionDispatch ソースコードを少し読んでみました。結果としては、両者には実装方法に違いがあるのが分かった。

ビューに…

と書くなどして確認すると分かりますが、request は ActionDispatch::Request クラスのオブジェクトです。

— 環境 —
Rails 5

request.url

request.url は ActionDispatch::Http::URL モジュール(action_dispatch/http/url.rb)で実装されています。

rails/url.rb at master – rails/rails

この ActionDispatch::Http::URL モジュールは、ActionDispatch::Request クラスで include されています。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

request.original_url

request.original_url は、ActionDispatch::Request クラス(action_dispatch/http/request.rb)で実装されています。

rails/request.rb at master – rails/rails

ActionDispatch::Http::URL モジュールをインクルードしてあるので、request.url のように ActionDispatch::Request#url インスタンスメソッドを使える。

original_url の実装で使われている base_url は Rack に実装されているメソッドです。ActionDispatch::Request が Rack::Request::Helpers をインクルードすることで、ActionDispatch::Request#base_url とインスタンスメソッドとして使えるようになっています。

request.base_url

request.base_url は、Rack::Request::Helpers モジュールに実装されている。

rack/request.rb at master – rack/rack

ということで以上、request.url と request.original_url は実装に違いにあることが分かりました。

もう少し request.url と request.original_url の違いを読み解く

request.original_url のほうは Rack 層の base_url を使って実装されています。そのため request.url と request.original_url では通信プロトコルの実装部分、各々 protocol と scheme を使っている箇所等が異なることになる。

ソースコードを追うと分かりますが、通信プロトコル部分を返す実装に以下のような違いがあります。

ActionDispatch::Http::URL

rails/url.rb at master · rails/rails

Rack::Request::Helpers

rack/request.rb at master · rack/rack

なので、http または https のみを利用する場合は request.url を使う、という理解で良いのかな? request.original_url(通信プロトコル取得が scheme メソッドによる実装)の場合、プロトコルが http/https じゃない場合でも環境変数 RACK_URL_SCHEME に値を設定すれば、任意の通信プロトコルを返せる実装になっている…(このへんあまり自信ありません)

とりあえずここまでです。request.fullpath と request.original_fullpath の違い等も、同様の手順でソースコードを追うことができます。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!