hiroohiのメモ

はてななのでITやスタートアップ周りの話(ほとんどが自分への備忘録だけど)を書いています。

Nginx+PassengerなRailsサイトのリダイレクト設定(スマホ以外をリダイレクト)

スマホ用サイトをRailsで作って、AWS上でNginx+Passengerで動かしています。 PC向けのサイトは別のサブドメで作ってあるため、スマホサイトにスマホ以外からアクセスがあった場合にはPC向けのサイトにリダイレクトする設定をしたのですが、思いっきりはまりましてid:jorakuさんに助けていただきました(ありがとうございます!)。

ググってもうまく見つけられなかったので、備忘録的に残しておきます。

条件は次の通り。

  • iPhone,iPod,Android携帯からのアクセス以外をPCサイトに飛ばす。
  • DocumentRootはELBのヘルスチェックもくるので、リダイレクト対象外。
  • 特定のディレクトリへのアクセスはURL体系が異なるので、ちゃんと変換する。

で、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。