質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

1回答

3345閲覧

[nginx]wwwありなしのリダイレクト設定時の「default」の記述について

teosu

総合スコア20

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

1クリップ

投稿2019/02/01 04:43

編集2019/02/01 09:45

【伺いたいこと概略】

server { listen 443 default ssl; server_name example.com; ssl on; 以下、略 }

listen 443 default ssl;の「default」とはどういう意味でしょうか?

【やりたいこと】
httpsを含むwwwありなしへのアクセスを下記のように統一したい
http://example.comhttps://example.com
http://www.example.comhttps://example.com
https://www.example.comhttps://example.com

【修正前】

server { listen 80; listen [::]:80; server_name example.com; return 301 https://$host$request_uri; } server { listen 80; listen 443; server_name www.exmaple.com; return 301 https://$host$request_uri; } server { listen 443 default ssl; server_name example.com; ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; }

【修正後】

server { listen 80; listen [::]:80; server_name example.com; return 301 https://$host$request_uri; } # http(s)://www.example.comへのアクセスをリダイレクト server { listen 80; listen 443; server_name www.exmaple.com;    # 追記 ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; return 301 https://example.com$request_uri; } server { listen 443 ssl default_server; #修正 server_name example.com; ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; }

wwwありなしのリダイレクトを行うために色々調べながら、上記の記述で目的は達成することができました。
return 301の記述は理解できるのですが、質問冒頭のdefault部分の意味が理解できず...
defaultの記述を外すとサイト自体にアクセスが出来なくなります。

調べると default_serverの説明がたくさんヒットするのですが、default_serverとは違うような気もします。
nginxに詳しくなくふわっとした質問で申し訳ないのですが、よろしくお願いします。

【参考にしたサイト】
常時SSL化 nginx でリダイレクト www ありに統一
Nginx で http も https も IP 直打ちのアクセスを弾きたい←追記

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

nginx のドキュメントで、listen のオプションを確認してみましたが、default がつくオプションは、default_server しかありませんので、おそらく default_server と記載するところを間違えてdefaultにしているのではないでしょうか?

http://nginx.org/en/docs/http/ngx_http_core_module.html#listen より

Syntax:

listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];


default_server と仮定して回答しますが...

How nginx processes a request

In this configuration nginx tests only the request’s header field “Host” to determine which server the request should be routed to. If its value does not match any server name, or the request does not contain this header field at all, then nginx will route the request to the default server for this port. In the configuration above, the default server is the first one — which is nginx’s standard default behaviour. It can also be set explicitly which server should be default, with the default_server parameter in the listen directive:

と書かれています。

意訳
もし Host ヘッダがいずれかのサーバ名と一致しない場合、またはこのフィールドが含まれていない場合は、nginxはリクエストをデフォルトサーバにルーティングします。
上記の設定ではデフォルトサーバは最初のものになり、nginx のデフォルトの動作です。
設定の最初のサーバをデフォルトサーバにしたくない場合は、listen ディレクティブに default_server を使って指定できます:


defaultの記述を外すとサイト自体にアクセスが出来なくなります。

ですが、

server {

listen 80; listen 443; server_name www.exmaple.com; return 301 https://$host$request_uri;

}

この設定の場合、$host は、www.exmaple.com になるので、 return 301 https://$host$request_uri; とすると return 301 https://www.exmaple.com$request_uri; と解釈されて、延々と https://www.exmaple.com にリダイレクトして、エラーになっているのではないでしょうか?

nginx のログに何かエラーが出ていませんか?

投稿2019/02/01 05:36

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teosu

2019/02/01 09:52

ご回答ありがとうございました。 仰るように修正前のコードではエラーを吐き出しており、一度動作を確認したつもりでしたが、www.exaple.com→example.comへのリダイレクトが再現できませんでした。 改めて調べて修正したのですが、修正後のコードだとリダイレクトされるようになりました。 ここで新たな不明点なのですが(すいません...)、# http(s)://www.example.comへのアクセスをリダイレクトするserverブロックの箇所でSSL証明書関連のファイルを書くものなのでしょうか? 最初はSSL証明書関連の記述は書いてなかったのですが、http://www.example.comからのリダイレクトは成功しますがhttps://www.example.comのリダイレクトはwww.example.comに証明書がないとエラーが出たので書いてみたら成功したといった次第です。 ネット上の記事だと、リダイレクト処理を書くserverブロックの箇所にSSL証明書関連の記述をしていないようなので疑問に思いました。
teosu

2019/02/01 09:57

よくよく考えたら質問事項(defaultは何なのか?)という点は回答をいただき解決したので、上記の追加質問は別で質問投稿した方が良いと思いました。 一度、nginxのドキュメントや書籍を読み内容を理解してからまた改めて投稿したいと思います。 連投失礼しましたmm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問