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

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

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

答案1

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

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

当改为

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

代理按预期工作。

[编辑]

甚至更好的版本,还可以传递查询字符串:

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

相关内容