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

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

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

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

Q&A

解決済

1回答

114閲覧

Nginxのドメイン振り分けが上手く動作しない.

shntr

総合スコア1

nginx

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

0グッド

0クリップ

投稿2024/04/04 06:28

実現したいこと

同一サーバーに対して異なるドメインからアクセスした時に処理を分けたい.
ドメイン名は異なりますがIPアドレスは同一です.

発生している問題・分からないこと

期待する処理としては,ttp://www.foo.com (※)では /var/www/foo/public 以下のコンテンツにアクセス,ttps://www.bar.com (※)では /var/www/bar/public 以下のコンテンッツにアクセスして欲しいです.上記2通りのURLでアクセスした場合は期待通りにそれぞれのコンテンツを表示してくれます.

問題なのは次のようなアクセスをした場合です.ttps://www.foo.com (※)にアクセスした場合に/var/www/bar/public以下のコンテンツが表示されます.

ttps://www.foo.com (※)にアクセスした場合に,/var/www/bar/public 以下のコンテンツを表示してほしくないです.期待する動作としては,444や403を返答したいです.

※注釈
リンクになるのでhttpとhttpsの先頭のhを省略して記載しています.

該当のソースコード

Nginx.conf

1worker_processes 1; 2 3 4events { 5 worker_connections 1024; 6} 7 8 9http { 10 include mime.types; 11 default_type application/octet-stream; 12 13 sendfile on; 14 keepalive_timeout 65; 15 16 server { 17 server_name www.foo.com; 18 root /var/www/foo/public; 19 20 location / { 21 index index.html; 22 } 23 } 24 25 server { 26 server_name www.bar.com; 27 root /var/www/bar/public; 28 location / { 29 index index.html, index.php; 30 } 31 32 error_page 500 502 503 504 /50x.html; 33 location = /50x.html { 34 root /usr/share/nginx/html; 35 } 36 37 location ~ \.php$ { 38 fastcgi_pass unix:/run/php-fpm/php-fpm.sock; 39 fastcgi_index index.php; 40 include /etc/nginx/fastcgi.conf; 41 } 42 43 44 location ~ /\.ht { 45 deny all; 46 } 47 location ^~ /data { 48 deny all; 49 } 50 location ^~ /.well-known/acme-challenge/ { 51 root /usr/share/nginx/html/.well-known; 52 } 53 54 listen 443 ssl; # managed by Certbot 55 (中略) 56 } 57 58 59 60 server { 61 if ($host = www.bar.com) { 62 return 301 https://$host$request_uri; 63 } # managed by Certbot 64 65 66 listen 80; 67 server_name www.bar.com; 68 return 404; # managed by Certbot 69 } 70 71 server { 72 server_name _; 73 return 444; 74 } 75 76}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「Nginx ドメイン 振り分け」や「Nginx VirtualHost」等で調べましたが,調べた限りではserver_nameを使って振り分ける方法をとっていています.
参考とした記事では,振り分ける場合のプロトコルはhttpまたはhttpsで統一されていたため,httpとhttpsが混在しているため発生している問題であると考えましたが,解決策は得られませんでした.

補足

以下に環境を記載します.
OS: Arch Linux
Nginx: 1.25.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

設定が一部省略されているので正確にはわかりませんが、おそらく listen 443; している server ディレクティブが server_name www.bar.com; の設定のみなのではないでしょうか。
server_nameが見つからないときは最初に記述された設定にフォールバックされます。

このような挙動を防ぐために、デフォルトサーバを設定し、アクセス出来ないようにするのがよくあるやり方です。

server { listen 80 default_server; listen 443 default_server; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; return 444; }

上記を記述した上で、www.foo.com www.bar.com それぞれの listen 443; のserverディレクティブを設定し、動作確認してみてください。

投稿2024/04/04 10:27

Eggpan

総合スコア2764

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

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

shntr

2024/04/04 16:01

ご回答ありがとうございます. ご提供いただいた方法で問題が解決しました. おかげで早急に対処できました.ありがとうございます. ベストアンサーにさせていただきます. 余談ですが,省略部分はcertbotが挿入したSSLのファイルパス等があるだけです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問