Nginx:将子域映射到代理服务器上的子目录

我有域example.com和子域blog.example.com 。 我有一个运行在localhost:5000的独angular兽应用程序,并使用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 

我发现我的错误是在这一行:

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

更改为

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

代理按预期工作。

[编辑]

更好的版本,也传递查询string:

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