nginx重写在url中添加子域名而不重定向

qyzbxkaa  于 12个月前  发布在  Nginx
关注(0)|答案(1)|浏览(116)

我想重写下面的网址没有重定向
From:example.com/group/abc/
收件人:group.example.com/abc/
我仍然想保持在用户浏览器的网址example.com/group/abc/。
我已经尝试了下面的NGINX配置,但它并没有阻止它重定向,因为http或https。
如果替换字符串以“http://"、“https://"或“$scheme”开头,则处理停止,重定向返回到客户端。

server {
  listen *:80;
  server_name  ~^(?<group>.*)\.example\.com$;

  location / {
    # Existing settings
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;

    proxy_pass          http://localhost:8090;

    # My addition
    if ($group = "") {
      rewrite ^/([^/]+)/(.*)$ http://$1.$host/$2 break;
    }
  }
}

我也试过rewrite ^/([^/]+)/(.*)$ http://$1.$host/$2 last;
我错过了什么?

nhaq1z21

nhaq1z211#

所以你在localhost:8090上有一个服务,它响应格式如下的请求://group.example.com/abc/
反向代理还接收类似//example.com/group/abc/的请求,这些请求需要在向上游传递到localhost:8090之前进行更改。
1.我建议您使用两个server块,一个用于处理对example.com的请求,另一个用于处理其他所有请求。

  1. localhost:8090分两部分接收请求。重要的是,域名部分在proxy_set_header Host值中传递给它。
    1.您不能使用rewrite更改域名(除非您使用它执行外部重定向),但您可以**使用rewrite**更改URL * 在域名 * 之后的部分,然后将其发送到上游。
    举例来说:
server {
  ...
  server_name *.example.com;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;

    proxy_pass  http://localhost:8090;
  }
}
server {
  ...
  server_name example.com;

  location / {
    rewrite ^/([^/]+)/(.*)$ /$2 break;

    proxy_set_header Host $1.$http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;

    proxy_pass  http://localhost:8090;
  }
}

请注意,我们使用$1中的rewrite捕获$1中的组名,但稍后在proxy_set_header Host语句中使用它来重新创建子域名。在上面的示例中,使用了$1.$http_host,但$1.example.com也可以工作。

相关问题