3

ユーザーエージェント文字列に基づいてユーザーを別のサブドメインにリダイレクトするラックミドルウェアを作成するにはどうすればよいですか?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文字列に何百ものバリエーションがあるため、キャッシュが同じページの複数のコピーでいっぱいになるのではないかと心配しています。

4

1 に答える 1

4

そこで、モバイル ユーザー エージェント文字列を検出し、サブドメインにリダイレクトし、サイト設定 Cookie の存在も検出する独自のミドルウェアを作成することにしました。別の方法で指定します。これを Rack スタックに移動して、Rack::Cache の前に実行するようにしました。これで問題が解決したようです。ここでソースを表示できます: https://gist.github.com/3630760

于 2012-09-05T04:56:12.780 に答える