web-dev-qa-db-ja.com

nginx https443サブドメインなしから「www」サブドメインへのリダイレクト

私の構成:

server {
  listen 80;
  server_name mydomain.com;
  rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}

server {
  listen 80;
  server_name www.mydomain.com;
  return 301 https://www.mydomain.com$request_uri;

  if ($Host !~* ^(www.mydomain.com)$ ) {
    return 444;
  }
}

server {
  listen 443;
  server_name www.mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;

  ...
}

機能します

  • mydomain.comからwww.mydomain.comへのリダイレクト
  • www.mydomain.comからhttps://www.mydomain.comへのリダイレクト

機能しません正しく:

  • ブラウザに直接https://mydomain.comを入力すると、www.mydomain.comへのリダイレクトは発生しませんが、リクエストはhttps://mydomain.com としてアプリケーションサーバーに渡されます。
    • ポート80の「入り口」がスキップされ、サーバーがポート443で直接アクセスされているように見えますが、私はNginxの専門家ではないため、わかりません。

上記のhttps://mydomain.com問題の解決策は何ですか?

SSLサーバーブロックでifステートメントを使用して、ホストを確認します。

server {
  listen 443;
  server_name www.mydomain.com mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;



  if ($Host = 'mydomain.com' ) {
     rewrite  ^/(.*)$  https://www.mydomain.com/$1  permanent;
  }

  ...
}
2
Chris Montanaro

私が推測したように、その理由は、ポート80がスキップされ、ポート443が直接アクセスされていたためです。次のserverブロックを追加すると、リダイレクトが有効になります。

server {
  listen 443;
  server_name mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}

より良いまたはよりエレガントな解決策を誰かが知っているなら、あなたの答えを追加してください。

悪の場合 であるため、回避することを好みます。また、正規表現エンジンを実行する必要がないため、リライトよりもリターンを使用することを好みます。

server {
  #default server that catches all undefined Host names
  listen 80 default_server;
  return 444;
}
server {
  #redirecting server for non-www ssl and non ssl domains
  listen 80;
  liste 443 ssl;
  server_name mydomain.com;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  return 301 https://www.mydomain.com$request_uri$is_args$query_string;
}
server {
  # redirecting server for www non ssl server
  listen 80; 
  server_name www.mydomain.com;
  return 301 https://mydomain.com$request_uri$is_args$query_string;
}
server {
  # main server config
  listen 443 ssl;
  server_name www.mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  # remaining config...
}
0