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.com
和example.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 将子域转换为路径组件而不进行重定向的主要内容,如果未能解决你的问题,请参考以下文章