2016-04-12 11 views
0

example.comwww.example.comの2つのサーバオブジェクトを定義しました。ユーザーがモバイルブラウザを使用している場合は、モバイルウェブサイトwww.example.com/mに自動的にリダイレクトします。Webおよびモバイルサイトのリダイレクト用にNGINXを設定します

tomcatにデプロイされたモバイル版とWeb版のプロジェクトには2つの異なるプロジェクトがあり、APIはウェブ版のみで公開されています。モバイルプロジェクトは同じWeb APIを使用するため、ルートは一般的です。

構成は次のとおりです。

server { 
    #listen 80 is default 
    listen   80; 
    listen   443 ssl; 

    ssl on; 
    ssl_certificate /path/to/certificates/www.example.com.chained.crt; 
    ssl_certificate_key /path/to/certificates/example.com.key; 

    location/{ 
    if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") { 
     return 301 https://www.example.com/m; 
    } 
     return 301 https://www.example.com; 
    } 

    location /m { 

    } 

    server_name example.com; 
} 
server { 
    listen   80; 
    listen   443 ssl; 

    ssl on; 
    ssl_certificate /path/to/certificates/www.example.com.chained.crt; 
    ssl_certificate_key /path/to/certificates/example.com.key; 
    server_name www.example.com; 
    if ($scheme = http) { 
     return 301 https://$server_name$request_uri; 
    } 
    root   /usr/share/tomcat/webapps/ExampleApp; 
    location/{ 

     proxy_set_header X-Forwarded-Host $host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_pass http://localhost:8080/; 
    } 
} 

この設定が正しく動作したとき:

  1. example.comはウェブ
  2. からモバイル
  3. example.comまたはwww.example.comから入力されます

ただし、次の場合は機能しません。

  1. www.example.comはモバイルから入力します(モバイルサイトの代わりにウェブ版を開きます)。

はどのようにして、ユーザーがモバイルからwww.example.comに入るとき、それはwww.example.com/mにリダイレクトすることができますか?

答えて

0

ブロック内に書き換えてif条件を実装できます。再書き込みループは、ブロックlocation /mを追加することによって回避されます。追加の書き換えが必要とされないようproxy_passに後続/を除去すること

server { 
    ... 
    server_name www.example.com; 
    ... 
    proxy_set_header X-Forwarded-Host $host; 
    proxy_set_header X-Forwarded-Server $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    location/{ 
     if ($http_user_agent ~* ...) { 
      rewrite^/m$request_uri last; 
     } 
     proxy_pass http://localhost:8080; 
    } 
    location /m { 
     proxy_pass http://localhost:8080; 
    } 
} 

注意:例えば。

ssl on;ディレクティブは、すべてのポート(ポート80まで)でSSLを有効にするため、設定から削除する必要があります。 listen 443 ssl;ディレクティブは、ポート443でのみSSLを有効にするのに十分です。

+0

ありがとうございます@リチャード、提案された実装では、すべてのAPI呼び出しが/ mに書き換えられるため、モバイルクライアントはAPI呼び出しを行うことができません。 www.example.com/loginはwww.example.com/m/loginにリダイレクトされます。 APIは/ mではなく/にあります。どうすればこの問題を解決できますか?私は正規表現の実装を試みたが、それは私のために動作しませんでした。 –

+0

@MohammadAslam書き換えたいURIがわからない。 '/'を '/ m'に書き直す場合は、' rewrite ^/$/m/last; 'を使います。その場合、リダイレクトループがないので、おそらく 'location/m'は必要ありません。 –

+0

変更がうまくいきました –