Nginx proxy_pass使用$host变量

亲戚公司是做SAAS的电商系统,有一个需求,需要通过客户的域名访问托管在阿里云OSS中该域名文件夹下的资源。
比如用户访问的
http://mall.shop.com/base.css,其实是访问 http://aliyun-oss.aliyuncs.com/mall.shop.com/base.css
http://www.mall.com/banner.jpg,其实是访问http://aliyun-oss.aliyuncs.com/www.mall.com/banner.jpg

upstream sh_aliyun {
        server aliyun-oss.aliyuncs.com:80 weight=10 max_fails=3 fail_timeout=10s;
}

server {
        listen 0.0.0.0:80;
        server_name _;
        location / {
             proxy_redirect off ;
             proxy_set_header Host  aliyun-oss.aliyuncs.com;   #填写OSS访问域名
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Real-Port $remote_port;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             client_max_body_size 50m;
             client_body_buffer_size 256k;
             proxy_connect_timeout 30;
             proxy_send_timeout 30;
             proxy_read_timeout 60;
             proxy_buffer_size 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;
             proxy_max_temp_file_size 128m;
             proxy_pass http://sh_aliyun/$host$request_uri;     #这里填写变量$host,是访问的主机名,$request_uri完整的请求参数
        }
}

踩过的坑:
直接使用
proxy_pass http://aliyun-oss.aliyuncs.com/$host$request_uri; 一直请求都是502
proxy_pass http://106.14.228.198/$host$request_uri; 这个是可以的

因此得出结论:
proxy_pass中如果存在变量,是不能使用域名的形式,只能借助upstream

原文地址:https://blog.51cto.com/fengwan/2416851

时间: 2024-10-15 18:23:55

Nginx proxy_pass使用$host变量的相关文章

nginx proxy_pass和rewrite的区别

rewrite syntax: rewrite regex replacement [flag] Default: - Context: server, location, if 如果正则表达式(regex)匹配到了请求的URI(request URI),这个URI会被后面的replacement替换 rewrite的定向会根据他们在配置文件中出现的顺序依次执行 通过使用flag可以终止定向后进一步的处理 如果replacement以"http://", "https://&

nginx proxy_pass配置及关于setcookie的一点说明

作者:zhanhailiang 日期:2015-02-01 nginx proxy_pass配置透传hd域的动态请求到wapi域下: server { listen 80; server_name hd.coalaawork.com; access_log logs/hd.coalaawork.com.access.log; root /usr/local/wwwroot/coalaawork/hd; location / { index index.html index.htm index.p

nginx中常见的变量

$arg_PARAMETER????????客户端GET请求PARAMETER的值. $args ????请求中的参数. $binary_remote_addr 二进制码形式的客户端地址. $body_bytes_sent 传送页面的字节数 $content_length 请求头中的Content-length字段. $content_type 请求头中的Content-Type字段. $cookie_COOKIE???? COOKIE的值. $document_root 当前请求在root指令

通过lua获取nginx的内置变量,通过这些变量做些逻辑的处理

Nginx提供了很多内置的变量,如: $arg_PARAMETER 这个变量包含在查询字符串时GET请求PARAMETER的值. $args 这个变量等于请求行中的参数. $binary_remote_addr 二进制码形式的客户端地址. $body_bytes_sent 传送页面的字节数 $content_length 请求头中的Content-length字段. $content_type 请求头中的Content-Type字段. $cookie_COOKIE cookie COOKIE的值

nginx 方向代理 通过变量代理多个服务

配置如下 server {     listen       80;     server_name  xxxxxxxx;     access_log   /var/log/nginx/inetrnal_access.log  main;     proxy_set_header   Host             $host;     proxy_set_header   X-Real-IP        $remote_addr;     proxy_connect_timeout   

Nginx Proxy_pass简述

Nginx 中 proxy_pass简述 nginx配置大家耳熟能详,网上资料也一大堆,但为了方便,还是要不厌其烦的写一写. proxy_pass为代理转发模块,主要功能是把请求转发到其它服务. 当使用proxy_pass(或fastcgi)时,请求会在nginx中缓冲,直到发送到后端的服务器上. 基本配置 location / { proxy_pass http://192.168.1.2:8080/; proxy_redirect off; proxy_set_header Host $ho

nginx proxy_pass

原文链接:https://www.jianshu.com/p/b010c9302cd0 在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径:如果没有/,表示相对路径,把匹配的路径部分也给代理走. 假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问. 第一种: location /proxy/ { proxy_pass http://127.0.0.1/; } 代理到URL:http://

nginx内置常用变量

HTTP核心模块支持一些内置变量,变量名与apache里的对应.比如 $http_user_agent,$http_cookie等表示HTTP请求信息的变量. 更多变量: $args, 请求中的参数; $content_length, HTTP请求信息里的”Content-Length”; $content_type, 请求信息里的”Content-Type”; $document_root, 针对当前请求的根路径设置值; $document_uri, 与$uri相同; $host, 请求信息中

nginx proxy_pass后的url加不加/的区别

在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. 下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问. 第一种: location  /proxy/ { proxy_pass http://127.0.0.1:81/; } 会被代理到http://127.0.0.1:81/test.html 这个url 第二咱