非常に古いレガシー アプリケーションと共存する必要がある Rails アプリケーションがあります。レガシ アプリケーションは、特定の文字列を含む値を持つ Cookie を探します。残念ながら、従来の Cookie の文字にはスラッシュが含まれていることがよくあります。私が抱えている問題は、Rails アプリケーションが Cookie を書き込むときに、最初に URL エンコードを行うことです。これにより、Cookie の値が正しくないため、レガシー アプリが壊れてしまいます。
ファイルを編集してRails 1.13.5でこれを機能させましたcookie_performance_fix.rb
(パス./actionpack-1.13.5/lib/action_controller/cgi_ext/cookie_performance_fix.rb
:)
これを機能させるために、次のようにコードを変更しました:
def to_s
buf = ""
buf << @name << '='
if @value.kind_of?(String)
rails code.
#buf << CGI::escape(@value)
buf << @value
else
#buf << @value.collect{|v| CGI::escape(v) }.join("&")
buf << @value.collect{|v| (v) }.join("&")
end
Rails をバージョン 2.3.2 にアップグレードすることを決定するまで、これは実際には問題なく機能していまし
た。Rails 2.3.2 では、cookie_performance_fix.rb
ファイルはもう存在しません。同じディレクトリを調べたところcookie.rb
、同様の方法で変更しようとしたというファイルが見つかりました。
def to_s
buf = ''
buf << @name << '='
#buf << (@value.kind_of?(String) ? CGI::escape(@value) : @value.collect{|v| CGI::escape(v) }.join("&"))
buf << (@value.kind_of?(String) ? @value : @value.collect{|v| (v) }.join("&"))
buf << '; domain=' << @domain if @domain
buf << '; path=' << @path if @path
buf << '; expires=' << CGI::rfc1123_date(@expires) if @expires
buf << '; secure' if @secure
buf << '; HttpOnly' if @http_only
buf
end
残念ながら、これはうまくいかないようです。Cookie は、新しい Rails 2.3.2 で引き続き URL エンコードされます。URL エンコーディングをオフにするのは最善の方法ではないことはわかっていますが、レガシー アプリケーションが廃止されるまではあまり選択肢がありません。残念ながら、Cookie の URL エンコード解除のサポートを追加するレガシー コードにアクセスできないため、スラッシュを含む正しいシーケンスでレガシー Cookie が書き込まれていることを確認する必要があります。Rails 2.3.2 で URL エンコーディングを無効にする方法を誰か教えていただければ幸いです。
ありがとう。