web-dev-qa-db-ja.com

Nginx:サブドメインをプロキシサーバー上のサブディレクトリにマップする

ドメインexample.comとサブドメインblog.example.comがあります。 localhost:5000で実行されているUnicornアプリケーションがあり、リバースプロキシとしてNginxを使用しています。

example.comだけを実行しても問題はありませんでした。ただし、サブドメインのサポートを追加したいので、いくつか問題があります。

example.com/blogにコンテンツがあります。 blog.example.comに、書き換えが使用されていることをユーザーに知らせずに、それを指すようにしたい。すべてのURLをマップしたいので、次のようにします。

  • blog.example.com-> localhost:5000/blog
  • blog.example.com/index.php-> localhost:5000/blog/index.php
  • blog.example.com/foo/bar-> localhost:5000/blog/foo/bar

これまでの私の最善の試みはこれです:

server
{
  listen 80;
  server_name blog.example.com;

  location / {
    proxy_pass http://localhost:5000/blog/$uri;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_Host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect off;
  }

  client_max_body_size 4G;
  keepalive_timeout 10;
}

これはblog.example.comを正しく書き換えますが、blog.example.com/index.phpで失敗します。

$ curl -v 'http://blog.example.com'
> GET /index.php HTTP/1.1
> Host: blog.example.com
> User-Agent: curl/7.51.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 26 Mar 2017 12:29:00 GMT
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 337
< Connection: keep-alive
< Location: http://blog.example.com/blog/index.php
2
Michael

私の間違いはこの行にあることがわかりました:

proxy_pass http://localhost:5000/blog/$uri;

に変更された場合

proxy_pass http://localhost:5000/blog$uri;

プロキシは期待どおりに機能します。

[編集]

さらに良いバージョンでは、クエリ文字列も渡します。

proxy_pass http://localhost:5000/blog$uri$is_args$args;
3
Michael