ユーザーエージェント文字列に基づいてユーザーを別のサブドメインにリダイレクトするラックミドルウェアを作成するにはどうすればよいですか?RailsアプリのRack::Cacheの前にこれを実行する必要があります。また、このミドルウェアでCookieの存在を検出できるようにしたいと思います。
- サブドメイン( "m.domain.com")にモバイル向けに最適化されたサイトがあります。
- 訪問者が「www.domain.com」にアクセスし、ユーザーエージェント文字列をモバイルデバイスとして認識し、サイト全体を優先することを示すCookieセットがまだない場合は、モバイルサブドメインにリダイレクトします。これは現在、アプリケーションコントローラーのbeforeフィルターで実行されています。
現在、Railsアプリでホームページのキャッシュヘッダーを設定すると、Rack :: Cacheはホームページをキャッシュしますが、モバイルユーザーがメインの「www」ドメインにアクセスすると、Rack::Cacheはキャッシュされたバージョンのページをヒットせずに提供しますRailsアプリの残りの部分なので、モバイルリダイレクトは実行されません。
モバイルリダイレクトソリューションを、Rack::Cacheの前に実行されるミドルウェアに移動する必要があるように思われます。コンテキストとして、ApplicationControllerでのフィルターは次のようになります。
before_filter :set_mobile_preferences
before_filter :redirect_to_mobile_if_applicable
def set_mobile_preferences
if params[:mobile_site]
cookies.delete(:prefer_web)
elsif params[:full_site]
cookies.permanent[:prefer_web] = 1
redirect_to_full_site if mobile_request?
end
end
# before filter
def redirect_to_mobile_if_applicable
if mobile_device? && !mobile_request? && !prefers_full_site?
new_url = request.protocol + domain_prefixes[:mobile] + '.' +
request.host_with_port.gsub(/^#{domain_prefixes[:web]}?\./, '') +
request.fullpath
redirect_to new_url and return
end
end
ページのキャッシュとモバイルユーザーの代替ドメインへのリダイレクトの両方の経験がある人はいますか?キャッシュレイヤーの前にこのリダイレクトをミドルウェアに移動することは正しい解決策のように見えますか?
ヒント、リンク、提案は大歓迎です。ありがとう!
更新:たぶんVary: User-Agent
、キャッシュの問題を解決するためにヘッダーを使用できますか?ただし、これを行うと、ブラウザによって送信されるUser-Agent文字列に何百ものバリエーションがあるため、キャッシュが同じページの複数のコピーでいっぱいになるのではないかと心配しています。