HTTP 反向代理内部重定向

HTTP 反向代理内部重定向

对我来说,这似乎是一个简单的场景:

  • 客户端向服务器发出反向代理请求Xhttp://proxy.example.com
  • 服务器X将请求转发给后端服务器Yhttp://internal1.example.com:8000
  • 后端服务器Y响应3xx重定向到另一个后端服务器Zhttp://internal2.example.com:8000
  • 代理服务器X 拦截3xx 重定向并再次向后端服务器发出请求Z它不会将 3xx 重定向返回给客户端。
  • 代理服务器将X后端服务器重定向请求的结果响应给客户端Z

我需要这个,因为有些客户端似乎无法处理重定向(尤其是在执行 PUT 时),所以我希望重定向在代理服务器上以不可见的方式内部进行。(我实际上在后端运行 WebDAV 服务器,所以我的客户端是 Cyber​​duck、Nautilus、OSX Finder 等)。

我搜索了大量现有的答案,但没有运气(这个问题基本上就是我想要的,但没有令人满意的答案,而且它已经一年没有活动了。希望从那时起情况有所改变)。

如果可能的话,我想使用现有的解决方案。Apache/Nginx 可以实现吗?

答案1

因此,在谷歌上搜索了更多内容,并在 IRC 上与 apache 人员聊天后,似乎 apache 无法解决这个问题。因此,我查看了 nginx,并设法找到了一个解决方案,其X-Accel-Redirect配置与本答案末尾的配置类似。

参见相关博客文章:

  • http://kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote/
  • http://kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/

    server {
        listen       80;
        server_name  example.com;
    
        location / {
            proxy_pass         http://localhost:8000/;
            proxy_redirect     http://localhost:8001   http://$host:8001;
    
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    
        # Proxy download 
        location ~* ^/internal_redirect/(.*?)/(.*) {
            # Do not allow people to mess with this location directly
            # Only internal redirects are allowed
            internal;
    
            # Location-specific logging
            access_log internal_redirect.access.log main;
            error_log  internal_redirect.error.log  debug;
    
            # Extract download url from the request
            set $download_uri  $2;
            set $download_host $1;
    
            # Compose download url
            set $download_url http://$download_host/$download_uri?$args;
    
            # Set download request headers
            proxy_set_header Host $download_host;
            proxy_set_header Authorization '';
    
            # The next two lines could be used if your storage 
            # backend does not support Content-Disposition 
            # headers used to specify file name browsers use 
            # when save content to the disk
            # proxy_hide_header Content-Disposition;
            # add_header Content-Disposition 'attachment; filename="$args"';
    
            # Do not touch local disks when proxying 
            # content to clients
            proxy_max_temp_file_size 0;
    
            # Download the file and send it to client
            # This is where the magic happens
            proxy_pass $download_url;
        }
    }
    

相关内容