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

Posted

技术标签:

【中文标题】反向代理将 url 重定向到子域【英文标题】:reverse proxy to redirect url to subdomain 【发布时间】:2021-01-16 03:26:21 【问题描述】:

我正在尝试将帮助 URL 从 example.com/help 重写为 help.example.come。 我尝试了很多配置 nginx 的方法,但是当我请求 example.com/help 时,会出现片刻内容,然后它会重定向到带有 help.example.come url 的主页。

我在工作中使用了 nuxtjs v2.13.3 和 nginx。这是我的 nginx 配置文件:

    nuxtjs 服务器块
    server 
        listen 80;
        index index.html;
        root /var/www/site/dist/;
        server_name  example.come;
    
        location / 
            proxy_pass http://127.0.0.1:3000;
        
    
    
        # help redirecting...
        location ~ ^/help/(.*)$ 
            return 301 $scheme://help.example.come/$1;
        
    
    子域服务器块
    server 
        listen 80;
        server_name help.example.come;
    
        location / 
            proxy_pass http://127.0.0.1:3000/help/;
        
    
        location /_nuxt/ 
            rewrite /help/(.*) /$1;
            proxy_pass http://127.0.0.1:3000/_nuxt/;
        
    
        location ~* \.(jpg|jpeg|gif|png|ico)$ 
            rewrite ^/_nuxt(/.*) $1;
            root /var/www/site/dist/;
            expires 30d;
        
    

【问题讨论】:

只是为了清楚。您想将 example.com/help 上的用户初始请求重定向到 help.example.com,然后将其代理给您的后端 nuxt???我说的对吗? 是的@TimoStark。实际上我为nuxt设置了一个特定的端口。 【参考方案1】:

不确定这是否完全符合您的需要,但是:

example.com/help/uri1/uri2 上的传入请求将被重定向到 help.example.com/help/uri1/uri2

在将请求代理到后端之前,我们正在重写 request_uri

rewrite ^/help(.*)$ /_nuxt$1 break;

在这里,我们将/help/ 替换为/_nuxt/

这是我的测试配置:

server                                                                                 
    listen 80;                                                                        
    server_name example.com;                                                                                    
    location /help                                                                     
      #return 301 http://help.example.com$request_uri;
      rewrite ^/help(.*)$ /_nuxt$1 break;                                            
      proxy_pass http://127.0.0.1:3000/;                            
                                                                                       
                                                                                       
                                                                                        
                                                                                        
                                                                                        
server                                                                                 
                                                                                        
        listen 80;                                                                    
        server_name help.example.com                                                                                
        location /                                                                     
         rewrite ^/help(.*)$ /_nuxt$1 break;                                            
         proxy_pass http://127.0.0.1:3000/;                                             
                                                                                        
                                                                                       
                                                                                       
                                                                                        
server                                                                                 
        #Fake Backend                                                                   
                                                                                        
        listen 3000;                                                                    
                                                                                        
        location /_nuxt                                                                
          add_header "Content-Type" "text/html";                                        
          return 200 "$request_uri \n";                                                 
                                                                                       
                                                                                        
                                                                                       
                                                                                        

我的实验室要求

8080 = example.com
8081 = help.example.com
8082 = fake bakend (:*3000)
root@deploy-VirtualBox:/etc/nginx/conf.d#curl -vL http://192.168.137.129:8080/help/uri1/uri2;
*   Trying 192.168.137.129...
* TCP_NODELAY set
* Connected to 192.168.137.129 (192.168.137.129) port 8080 (#0)
> GET /help/uri1/uri2 HTTP/1.1
> Host: 192.168.137.129:8080
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.19.3
< Date: Wed, 30 Sep 2020 17:12:59 GMT
< Content-Type: text/html
< Content-Length: 169
< Connection: keep-alive
< Location: http://192.168.137.129:8081/help/uri1/uri2
<
* Ignoring the response-body
* Connection #0 to host 192.168.137.129 left intact
* Issue another request to this URL: 'http://192.168.137.129:8081/help/uri1/uri2'
* Found bundle for host 192.168.137.129: 0x55623c402020 [can pipeline]
*   Trying 192.168.137.129...
* TCP_NODELAY set
* Connected to 192.168.137.129 (192.168.137.129) port 8081 (#1)
> GET /help/uri1/uri2 HTTP/1.1
> Host: 192.168.137.129:8081
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.19.3
< Date: Wed, 30 Sep 2020 17:12:59 GMT
< Content-Type: text/html
< Content-Length: 18
< Connection: keep-alive
<
/_nuxt/uri1/uri2
* Connection #1 to host 192.168.137.129 left intact

【讨论】:

感谢蒂莫的回复。我希望help.example.comexample.com/help 都有相同的点。但在你的回答中 help.example.comexample.com 是一样的。 那么您希望 help.example.com 和 example.com/help 以相同的方式工作吗?将请求发送到同一个后端?但这也意味着,不会有!从 example.com/help 重定向到 help.example.com:这是您需要的吗? 不知何故,是的!我希望 help.example.comexample.com/help 请求到同一个后端,而且 example.come/help 重定向到 help.example.com 所以基本上你不能重定向用户并发送来自支持的响应。我已经更新了我的示例。 help.example.comexample.com/help 现在正在做同样的事情。

以上是关于反向代理将 url 重定向到子域的主要内容,如果未能解决你的问题,请参考以下文章

在 apache 2.2.3 上设置通配符子域(带有反向代理)

Angular CLI 支持子域反向代理

apache反向代理更改url

Nginx反向代理:将所有http请求重定向到https

在网站前面使用反向代理将 http 请求从 iframe 中重定向到网站

在反向代理的背后,Spring Security登录重定向到错误的端口