Nginx+PassengerなRailsサイトのリダイレクト設定(スマホ以外をリダイレクト)
スマホ用サイトをRailsで作って、AWS上でNginx+Passengerで動かしています。 PC向けのサイトは別のサブドメで作ってあるため、スマホサイトにスマホ以外からアクセスがあった場合にはPC向けのサイトにリダイレクトする設定をしたのですが、思いっきりはまりましてid:jorakuさんに助けていただきました(ありがとうございます!)。
ググってもうまく見つけられなかったので、備忘録的に残しておきます。
条件は次の通り。
- iPhone,iPod,Android携帯からのアクセス以外をPCサイトに飛ばす。
- DocumentRootはELBのヘルスチェックもくるので、リダイレクト対象外。
- 特定のディレクトリへのアクセスはURL体系が異なるので、ちゃんと変換する。
- スマホ:sp.example.com/hoge/2
- PC: example.com/hoge/detail/?id=2
で、nginx.confはこうなります。
location /stores/ { if ($http_user_agent !~ "(iPhone|iPod|Android.*Mobile)"){ rewrite ^/hoge/(.*)$ http://example.com/hoge/detail/?id=$1 permanent; } passenger_enabled on; rails_env production; } location / { if ($http_user_agent !~ "(iPhone|iPod|Android.*Mobile|HealthChecker)"){ rewrite ^.*$ http://example.com$request_uri redirect; } passenger_enabled on; rails_env production; }
ポイントは
passenger_enabled on; rails_env production;
の部分で、各location{}の中に書いてあげないと、リクエストがPassengerに渡らず静的ページとして処理しようとして404が返却されます。 これに悩まされて,最終的に助けていただいたと。
ちなみに、PC側はPHPなのですが、その場合はrewriteルールだけ書けばOK。