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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

nginx

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3436閲覧

nginxでサブドメインの値をディレクトリとしてURLを変えずに特定のページを表示したい

pdj_kt

総合スコア16

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

nginx

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/11/20 12:00

編集2017/11/21 00:35

例えば「**http://xxx.example.com**」(xxxはサブドメイン/example.comは仮のURL)にアクセスした際、ブラウザに表示されるURLはこのままで、実際には「**http://example.com/xxx/**」を表示したいと思っています。

そこで、/etc/nginx/conf.d/default.confに下記を追記しました。

conf

1server { 2 listen 80; 3 server_name ~^(.*).example.com$; 4 5 location / { 6 proxy_pass http://example.com/$1; 7 } 8}

すると「502 Bad Gateway」が返されてしまいます。
「$1」の部分を「xxx」と固定にすると正しい結果が得られるので、「$1」がうまく取得できないないのだと思いますが、どのようにしたら良いでしょうか。


###2017.11.21追記

error.logの内容は下記の通りです。

log

12017/11/21 00:05:27 [error] 2961#2961: *3 no resolver defined to resolve example.com, client: 192.168.10.1, server: ~^(.*).example.com$, request: "GET / HTTP/1.1", host: "xxx.example.com" 22017/11/21 00:05:27 [error] 2961#2961: *3 no resolver defined to resolve example.com, client: 192.168.10.1, server: ~^(.*).example.com$, request: "GET /favicon.ico HTTP/1.1", host: "xxx.example.com", referrer: "http://xxx.example.com/"

また、実行環境についてはwin8.1にVirtualBox + Vagrantで環境構築し、hostsに下記を設定しています。

hosts

1192.168.10.10 example.com xxx.example.com

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

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

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

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

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

guest

回答3

0

ベストアンサー

「502 Bad Gateway」が返されてしまいます。

error_log には何か出力されていないでしょうか。
例えば、hogehoge.jp の名前解決ができないなど。

※hogehoge.jp は実在するので、example.com, example.jp などにした方がいいと思います。

「$1」の部分を「xxx」と固定にすると正しい結果が得られるので、「$1」がうまく取得できないないのだと思いますが

$1 が取得できない(空)なのであれば、「502 Bad Gateway」ではなく、別の応答コードになるような気がします。
関係ないかもしれませんが、以下のように URL のパスの最後に「/」を付けないと、プロキシー先からリダイレクト(301 や 302)が返ってくるかもしれません。

proxy_pass http://hogehoge.jp/$1; ↓ proxy_pass http://hogehoge.jp/$1/;

(2017/11/21 12:00) 追記
error_log を見ると、名前解決できていないようです。
proxy_pass に設定したドメイン名の名前解決は、resolver によって行なわれますので、hosts ファイルは参照できないのではないでしょうか。

proxy_pass http://192.168.10.10/$1/; と、IPアドレスで設定するとどうなりますか?

投稿2017/11/20 16:09

編集2017/11/21 03:00
TaichiYanagiya

総合スコア12141

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

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

pdj_kt

2017/11/21 00:37

ありがとうございます。 error.logは出力されておりましたので、質問内容に追記いたしました。 (hogehoge.jpは質問用に書き換えた仮のURLです。紛らわしいのでexample.comに修正しました。) URLのパスの最後に「/」を付けましたが、やはり同じエラーが返ってしまいます。
pdj_kt

2017/11/21 04:14

やはりhostsの設定では名前解決できないんですね。 IPアドレスにしてみましたが、「500 Internal Server Error」が返るようになりました。 ログの内容は下記の通りとなります。 error.log---------- 2017/11/21 04:07:14 [alert] 6857#6857: *10363 768 worker_connections are not enough while connecting to upstream, client: 192.168.10.10, server: ~^(.*).example.com$, request: "GET // HTTP/1.0", upstream: "http://192.168.10.10:80//", host: "192.168.10.10" 2017/11/21 04:07:14 [alert] 6857#6857: *11127 768 worker_connections are not enough while connecting to upstream, client: 192.168.10.10, server: ~^(.*).example.com$, request: "GET // HTTP/1.0", upstream: "http://192.168.10.10:80//", host: "192.168.10.10", referrer: "http://xxx.example.com/" ---------- 単純にworker_connectionsを増やせば良いという感じでは無さそうですが・・・
TaichiYanagiya

2017/11/21 04:22

プロキシー先も自分自身なのですね。 ループしているのではないでしょうか? プロキシー先の server_name に 192.168.10.10 を追加してみてください。
pdj_kt

2017/11/21 06:15

自分自身(/etc/nginx/conf.d/default.conf)に「server_name 192.168.10.10」を追記したところ、無事アクセスできました!ただ、IPアドレスのままでは、その先のPHPのフレームワークで都合が悪い為、下記のように追記しました。 default.conf---------- server { server_name 192.168.10.10; location / { proxy_pass http://example.com; } } ---------- この方法が正しいのかわかりませんが、取り敢えずは希望通りの動きとなっています。 ありがとうございました!
guest

0

最終的に下記の通りupstreamを追記して対応できました。

server { listen 80; server_name ~^(.*).example.com$; location / { proxy_pass http://example.com/$1$request_uri; } } upstream example.com { server localhost:80; }

投稿2017/11/21 07:53

編集2017/11/21 07:59
pdj_kt

総合スコア16

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

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

0

DocumentRoot を xxx とすることで対応できる気がするのですが、いかがでしょうか?

投稿2017/11/21 01:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問