Nginx 将子域转换为路径组件而不进行重定向

Posted

技术标签:

【中文标题】Nginx 将子域转换为路径组件而不进行重定向【英文标题】:Nginx convert subdomain to path component without redirect 【发布时间】:2013-01-07 15:42:02 【问题描述】:

这个想法是将传入的请求发送到http://abc.example.com/...,然后将它们重写为http://example.com/abc/...

使用 301/302 重定向很容易做到这一点:

# rewrite via 301 Moved Permanently
server 
  listen 80;
  server_name abc.example.com;
  rewrite ^ $scheme://example.com/abc$request_uri permanent;

诀窍是当abc.example.comexample.com 指向同一个nginx 实例时,将这个URL 更改透明 到客户端。

换句话说,当请求abc.example.com/... 并且没有另一个客户端往返时,Nginx 能否提供来自example.com/abc/... 的内容?

起点配置

使用 301 完成任务的 Nginx 配置:

# abc.example.com
server 
  listen 80;
  server_name abc.example.com;
  rewrite ^ $scheme://example.com/abc$request_uri permanent;


# example.com
server 
  listen 80;
  server_name example.com;
  location /  
    # ...
  

【问题讨论】:

【参考方案1】:
# abc.example.com
server 
  listen 80;
  server_name abc.example.com;
  location / 
    proxy_pass http://127.0.0.1/abc$request_uri;
    proxy_set_header Host example.com;
  

【讨论】:

拥有 Nginx 代理非常好用。将主机更改为 127.0.0.1 因为否则 Nginx 必须解析主机名(一个完全独立的问题)。添加了$request_uri,以便将路径附加到代理请求中。 这非常有效。请注意可能出现 404 的静态资产。 @KJPrince 404 资产有什么问题? 这也适用于您的目标主机使用 SSL - proxy_pass https://127.0.0.1/abc$request_uri 多个子域或通配符子域的任何解决方案?

以上是关于Nginx 将子域转换为路径组件而不进行重定向的主要内容,如果未能解决你的问题,请参考以下文章

apache中的vhost重写规则-摆脱子域而不重定向

将任何子域重定向到主域上的页面

将通配符子域重定向到子目录,而不更改地址栏中的 URL

Dockerized Nginx将不同的子域重定向到同一页面

NGINX重定向所有请求将URL与参数匹配到子域

反向代理将 url 重定向到子域