nginx 实现多域名转发到web服务不同路径

本文介绍了一种将多个前端应用合并到单个Node.js服务的方法,并详细探讨了使用Nginx进行子路径代理配置的过程。文章解决了静态资源加载及API请求路径匹配等问题。

项目背景

我们有个项目前端是用vue 写的,node 起的web服务,中转api到后台接口。

但是项目下有多个平台,可以理解成多个端,每个端都有自己的node web服务,绑定不同端口,如3001 3002 3003 3004 ...

这有个麻烦的就是部署,需要启多个服务。

现在想把多个端合并在一起,起一个node web 服务。

端的区别用路径。如a 端就是/a ,b端就是/b

这样在开发时是可以使用的。麻烦的一点就是解决多个端session 的问题。

部署时需要www.x.com 访问/

a.x.com 访问 /a/

b.x.com 访问/b/

这样就需要用nginx 实现代理了。

但是又有一个问题,a.x.com 访问的是/a/,导致静态资源加载不了。

解决:

location ~ .*\.(jpg|gif|jpeg|bmp|png|ico|js|json)$ 
        { 
            access_log off;            
            root /mnt/csyl_web/public;
        #expires 定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
            expires      1d; 
        } 

测试时发现发起的api 请求访问不到。

请求都是在根目录,通过a.xx.com访问的就是/a/get 了。

还需要想办法解决,区分开来。

因为是SPA 项目,只有一个页面,请求/时node 返回页面。其他的都是请求了。

location = / 时 访问/a/

location /  时访问/

以下是代码

#----------------wwww
    server {
        listen       80;
        server_name  www.a.com;
   	location / {
            proxy_pass http://localhost:3010/;
        }
     }	
#----------------------------g
    server {
        listen       80;
        server_name  g.a.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location ~ .*\.(jpg|gif|jpeg|bmp|png|ico|js|json)$ 
        { 
            access_log off;            
            root /mnt/csyl_web/public;
        #expires 定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
            expires      1d; 
        } 


        location = / {
            #root   html;
            #index  index.html index.htm;

            proxy_http_version  1.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_read_timeout  120;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    Upgrade $http_upgrade;
            proxy_set_header    Connection "upgrade";
            proxy_buffering off; #禁用缓存
            #proxy_pass          http://myapp;
            proxy_pass http://localhost:3010/webg/;
        }
        location / {
            proxy_pass http://localhost:3010/;
        }
    }



   #-----------------------------o
    server {
        listen       80;
        server_name  o.a.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

	    location ~ .*\.(jpg|gif|jpeg|bmp|png|ico|js|json)$ 
        { 
            access_log off;            
            root /mnt/csyl_web/public;
        #expires 定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
            expires      1d; 
        } 
        location = / {
            #root   html;
            #index  index.html index.htm;

            proxy_http_version  1.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_read_timeout  120;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    Upgrade $http_upgrade;
            proxy_set_header    Connection "upgrade";
            proxy_buffering off; #禁用缓存
            #proxy_pass          http://myapp;
            proxy_pass http://localhost:3010/webo/;
        }


        location / {
            proxy_pass http://localhost:3010/;
            #index  index.html index.htm;
        }

        
    }


<think>我们正在处理一个Nginx配置问题:将一个域名转发到另一个域名。根据用户需求,我们需要配置Nginx,使得访问旧域名的请求被重定向到新域名。根据引用[1],我们可以使用rewrite指令来实现重定向。引用[1]中的示例配置如下:server{listen80;server_nameold-domain.com;location/{rewrite^/(.*)$http://new-domain.com/$1permanent;}}这个配置将所有进入old-domain.com的请求重定向到new-domain.com,并保留原始请求的URI部分。其中,permanent表示永久重定向(HTTP301)。另外,引用[2]和[3]提到了使用proxy_pass进行代理转发,但注意,代理转发和重定向是不同的。重定向是告诉浏览器去访问新的URL,而代理转发服务器内部将请求转发到另一个服务,浏览器地址栏不变。用户明确要求“转发到另一个域名”,但根据问题描述,用户说“我想将一个域名通过Nginx转发到另一个域名的配置方法”,这里需要明确用户的需求是重定向(浏览器地址改变)还是代理(浏览器地址不变)?然而,在引用[1]中使用了重定向(rewrite+permanent),在引用[3]中使用了代理(proxy_pass)。由于用户问题中使用了“转发”一词,在技术语境中可能有歧义。但根据常见的Web开发实践,当提到“将域名A转发到域名B”时,通常是指重定向(即用户访问A,然后浏览器跳转到B)。因此,我们优先考虑重定向方式。但是,为了全面性,我们可以提供两种方案:方案一:重定向(浏览器地址改变)方案二:代理(浏览器地址不变,Nginx作为反向代理将请求转发到另一个域名)根据引用[4],nginx的stream模块通常用于TCP/UDP转发,而HTTP的代理转发通常使用http模块。因此,对于HTTP请求,我们使用http模块中的proxy_pass进行代理。下面我们将分别给出两种配置:方案一:重定向(使用rewrite)server{listen80;server_nameold-domain.com;return301http://new-domain.com$request_uri;#这是一种更高效的写法,直接返回301并指定新URL#或者使用rewrite:#location/{#rewrite^(.*)$http://new-domain.com$1permanent;#}}注意:使用return指令比rewrite更高效,因为return在匹配到server_name后直接返回,不需要进入location块。所以我们推荐使用return。方案二:代理(使用proxy_pass)server{listen80;server_nameold-domain.com;location/{proxy_passhttp://new-domain.com;#注意这里新域名后面不要加斜线,否则会改变URIproxy_set_headerHost$host;#可以设置Host头,根据需要决定是否修改proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}}在代理方案中,我们通常需要设置一些HTTP头,以便目标服务器能够获取真实的客户端信息。由于用户问题中没有明确是重定向还是代理,我们可以根据常见情况先提供重定向方案,并说明如果用户需要隐藏实际后端(即用户浏览器地址栏不变)则使用代理方案。另外,如果用户需要同时支持HTTPS,那么还需要监听443端口并配置SSL证书(如果旧域名有SSL证书的话)。但用户问题中没有提到HTTPS,因此我们以HTTP为例。因此,我们给出两种配置,并解释其区别。最后,根据用户要求,生成相关问题。</think>### Nginx 配置域名重定向到另一个域名 要实现域名重定向(浏览器地址会变化),推荐使用 **HTTP 301 永久重定向**,配置简洁高效。以下是详细步骤: #### 方法 1:使用 `return` 指令(推荐) ```nginx server { listen 80; server_name old-domain.com; # 替换为你的旧域名 return 301 http://new-domain.com$request_uri; # 替换为目标域名 } ``` - **原理**: 所有访问 `old-domain.com` 的请求,直接返回 `301` 状态码跳转到 `new-domain.com`,并保留原始 URI(如 `old-domain.com/path` → `new-domain.com/path`)。 - **优势**: 性能更高(无需正则匹配),符合 SEO 规范[^1]。 #### 方法 2:使用 `rewrite` 指令 ```nginx server { listen 80; server_name old-domain.com; location / { rewrite ^(.*)$ http://new-domain.com$1 permanent; # permanent 表示 301 重定向 } } ``` - **适用场景**: 需更复杂的重定向逻辑时(如按路径规则跳转)[^1][^2]。 --- ### ⚠️ 注意事项 1. **区分重定向与代理**: - **重定向**(如上):浏览器地址会变(跳转到新域名)。 - **代理**(使用 `proxy_pass`):浏览器地址不变,Nginx 隐藏后端服务(配置见引用[2][^3])。 2. **HTTPS 支持**: 若需跳转 HTTPS 站点,将 `http://` 改为 `https://`,并配置 SSL 证书: ```nginx server { listen 443 ssl; server_name old-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; return 301 https://new-domain.com$request_uri; # HTTPS 跳转 } ``` 3. **生效步骤**: - 保存配置到 `/etc/nginx/conf.d/redirect.conf` - 执行 `nginx -t` 测试配置 - 执行 `nginx -s reload` 重启服务 --- ### 常见问题场景 1. **保留请求路径** `$request_uri` 变量会自动携带原始路径(如 `/user?id=1`)。 2. **通配域名重定向** 若需跳转所有子域名: ```nginx server { server_name ~^(.*)\.old-domain\.com$; # 正则匹配子域名 return 301 http://$1.new-domain.com$request_uri; # $1 为子域名部分 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值