电商商城定制开发nginx代理去掉URl前缀

电商商城定制开发今天接到一个配置的需求是:电商商城定制开发需要访问某个域名时,nginx电商商城定制开发可以去掉前缀去代理访问到后端

电商商城定制开发正常配置情况下:
在nginx配置文件中中设置了 location /prod-api/api 时 浏览器访问 /prod-api/api 到后端服务后,后端服务接收到的url地址实际还是 /prod-api/api

需要实现的功能需求:
访问url路径/prod-api/api经过nginx反向代理后,到达后端服务的实际url地址为/api

以下是原nginx配置文件中location部分的配置内容:

server {        listen 80;        server_name localhost;        charset utf-8;                 location / {        root /usr/share/nginx/html/cashier;        try_files $uri $uri/ /index.html;        index index.html index.htm;    }    location /prod-api/ {        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header REMOTE-HOST $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-NginX-Proxy true;        proxy_pass http://127.0.0.1:9076;    }       access_log /var/log/nginx/access.log main;       error_log /var/log/nginx/error.log warn;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

将上述代码修改为如下nginx location代码:

server {        listen 80;        server_name localhost;        charset utf-8;                 location / {        root /usr/share/nginx/html/cashier;        try_files $uri $uri/ /index.html;        index index.html index.htm;    }    location ^~/prod-api/ {        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header REMOTE-HOST $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-NginX-Proxy true;        proxy_pass http://127.0.0.1:9076/;    }       access_log /var/log/nginx/access.log main;       error_log /var/log/nginx/error.log warn;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

注意点:

  • 在proxy_pass 反向代理地址最后加一个/
  • 在location匹配的url路径前添加^~/

location ^~/prod-/:匹配任何以 /prod-api/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

  • 不可以使用:proxy_set_header Host $http_host;

我在现有环境的nginx里添加这段配置之后,访问会转不过去,查看nginx日志也只能看到是404信息,并没有更多定位问题的信息。检查了许久也没找到原因,于是注释掉location 里面所有配置,里面只加proxy_pass这段配置,结果nginx是能够转发成功的,这说明单独来看这条location的配置是没有问题的,很有可能是现有环境nginx里的某些配置影响到了这个转发。

为了定位问题原因,location下的配置逐个注释来定位问题,最后发现当注释掉proxy_set_header Host $http_host ;这条配置之后,就能成功转发了。这才注意到是反向代理配置的问题。

此配置的作用是:把原http请求的Header中的Host字段也放到转发的请求里。
如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。

但是现有环境中原有的配置也不能随便删掉,所以可以进行如下设置:

即,在location里面添加一条 proxy_set_header Host $proxy_host;配置。

设置 proxy_set_header Host $host 时,浏览器直接访问 nginx,获取到的 Host 是 $host 的值,没有端口信息。此时代码中如果有重定向路由,那么重定向时就会丢失端口信息,导致 404

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发