解决Nginx 配置 proxy_pass 后 返回404问题

一、 Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位

1.1、 问题

在一次生产涉及多次转发的配置中, 需求是下面的图:
在配置好了 proxy_pass 之后,请求 www.djx.com 直接返回 404,没有什么其他的异常。 但是我们直接请求后端 www.baidu.com 是正常响应的。这就很怪异的。 看日志请求也是转发到了 www.baidu.com 的。但是请求响应就是404.

1.2、 寻找问题原因

我们的默认的 Nginx的 proxy_set_header 配置是

proxy_set_header Host $host;
  • 服务端: 192.168.2.189
  • 服务端1:192.168.1.180 Nginx1
  • 服务端2:192.168.1.90 Nginx2

当我们是这个的设置的时候,当第一层 Nginx(Nginx1)代理后,我们请求的域名是 www.djx.com ,从这个请求的 header 获取到的 host 的值是 www.djx.com, 我们通过 配置

proxy_set_header Host $host;

将 host 的值设置为转发 的Host 值,但是请求的域名是 www.baidu.com , 也就是 header 里面的是 host 字段是 www.djx.com , 请求的域名和 header 里面的 Host 的不一致导致的。

1.3、 proxy_set_header 官方信息

官方文档

默认设置为

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

1.4、 解决办法

Host 的值设置为 $proxy_host, $proxy_host 的值详解见下面扩展。

proxy_set_header Host $proxy_host;

二、扩展 常用的配置

1. $proxy_host

proxy_set_header Host  $proxy_host;
# 默认配置
# 顾名思义,请求头设置的为代理后的域名。

示例1:
当我们配置了 upstream, 那么$proxy_host 的值就是 upstream 的名字

upstream open-hz8443{
server 10.60.6.184:8000 max_fails=1 fail_timeout=3s weight=10;
}

那么这里 $proxy_host 的值就是 open-hz8443。

示例2:
当我们没有配置 upstream, 那么 $proxy_host 的值就是 proxy_pass 后面的地址ip和端口. 10.60.6.184:8000. 如果是 proxy_pass http://www.djx.com:8000; 那么 $proxy_host 的值就是 www.djx.com:8000.

location ^~ /wss/v1
{
 proxy_pass http://10.60.6.184:8000;
 proxy_set_header Host $proxy_host;
 proxy_set_header Connection "upgrade";
 proxy_set_header Upgrade $http_upgrade;
 tcp_nodelay on; 

}

2. $host

proxy_set_header Host  $host;
# 当字段不在请求头中就无法传递了,在这种情况下,可通过设置Host变量,将需传递值赋给Host变量

当请求 Header 里 Host 无值的时候,直接拿 server_name 的值进行填充。

当请求 Header 里 Host 的值的时候,就直接拿 请求 Header 里面的 Host 的值。

3. $host:$proxy_port

proxy_set_header Host  $host:$proxy_port;

# 服务器名称和端口一起通过代理服务器传递,相对上一项,多了一个 $proxy_port,这个 $proxy_port 是proxy_pass 里面的那个端口,如果没有端口,像80 和 443 的话。也是会使用 80 /443 填充, 

示例:
proxy_pass http://www.baidu.com;

$host:$proxy_port = 百度ip:80

4. $http_host

proxy_set_header Host  $http_host;
# 一个不会变化的“Host”头请求字段可通过如下方式被传递:

当请求 Header 里 Host 无值的时候,直接拿 server_name 的值进行填充。并加上端口。如果是 80/443 则不加。 其实就是去 请求url 里面的值。 http://server:port/v1

当请求 Header 里 Host 的值的时候,就直接拿 请求 Header 里面的 Host 的值。

示例

  • 服务端: 192.168.2.189
  • 服务端1:192.168.1.180 Nginx1
  • 服务端2:192.168.1.90 Nginx2

基础配置
192.168.1.180 Nginx1

server{
 listen 80;
 server_name www.djx.com;

 location / {
  proxy_pass http://www.baidu.com/;
 }

}

192.168.1.190 Nginx2

server{
 listen 80;
 server_name www.baidu.com;

 location / {
  proxy_pass http://192.168.1.80:8080/;
 }

}

** 使用基础配置 **
也就是

proxy_set_header Host  $proxy_host; 

那么到 http://192.168.1.80:8080/ header 的值为 www.baidu.com.

** 使用 $host **
也就是

proxy_set_header Host  $host; 

参考文章:https://cloud.tencent.com/developer/article/1557504

到此这篇关于Nginx 配置 proxy_pass 后 返回404问题的文章就介绍到这了,更多相关Nginx 配置 proxy_pass 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • nginx proxy_pass反向代理配置中url后加不加/的区别介绍

    前言 nginx作为web服务器一个重要的功能就是反向代理.nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理. 而在日常的web网站部署中,经常会用到nginx的proxy_pass反向代理,有一个配置需要弄清楚:配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走(这样配置可以参考这篇文章). 下面举个小实

  • Nginx服务器的反向代理proxy_pass配置方法讲解

    就普通的反向代理来讲 Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以 location / { proxy_pass http://127.0.0.1:8008; } Apache2的反向代理的配置是: ProxyPass /ysz/ http://localhost:8080/ 然而,如果要配置一个相对复杂的反向代理 Nginx相对Apache2就要麻烦一些了 比如,将url中以/wap/开

  • Nginx代理proxy pass配置去除前缀的实现

    目录 一个种方案是proxy_pass后面加根路径/. 另一种方案是使用rewrite 使用Nginx做代理的时候,可以简单的直接把请求原封不动的转发给下一个服务. 比如,访问abc.com/appv2/a/b.html, 要求转发到localhost:8088/appv2/a/b.html 简单配置如下: upstream one { server localhost:8088 weight=5; } server { listen 80; server_name abc.com; acces

  • nginx配置proxy_pass中url末尾带/与不带/的区别详解

    nginx配置proxy_pass时url末尾带"/"与不带"/"的区别如下: 注意:当location为正则表达式匹配模式时,proxy_pass中的url末尾是不允许有"/"的,因此正则表达式匹配模式不在讨论范围内.  proxy_pass配置中url末尾带/时,nginx转发时,会将原uri去除location匹配表达式后的内容拼接在proxy_pass中url之后. 测试地址:http://192.168.171.129/test/tes

  • 解决Nginx 配置 proxy_pass 后 返回404问题

    一. Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1. 问题 在一次生产涉及多次转发的配置中, 需求是下面的图: 在配置好了 proxy_pass 之后,请求 www.djx.com 直接返回 404,没有什么其他的异常. 但是我们直接请求后端 www.baidu.com 是正常响应的.这就很怪异的. 看日志请求也是转发到了 www.baidu.com 的.但是请求响应就是404. 1.2. 寻找问题原因 我们的默认的 Nginx的 proxy_set_hea

  • nginx配置域名后的二级目录访问不同项目的配置操作

    场景描述: 通过二级目录(虚拟目录,应用程序)的方式访问同一ip+端口的不同应用,例如location是用户使用页面,location/admin/是管理页面,location部署在192.168.1.100的80端口,location/admin部署在172.20.1.32的8080端口上. 解决方案: 使用nginx反向代理,配置如下: server { listen 80; server_name demo.domain.com; #通过访问service二级目录来访问后台 locatio

  • 解决vue打包项目后刷新404的问题

    vue打包项目后刷新404的问题Nginx配置 server { listen 80; server_name localhost; index index.html; root /root/dist; location / { root /root/dist; try_files $uri $uri/ /index.html =404; } } 以上这篇解决vue打包项目后刷新404的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: Vu

  • springboot中PostMapping正常接收json参数后返回404问题

    目录 PostMapping接收json参数后返回404 问题描述 解决 @PostMapping注解解析 PostMapping接收json参数后返回404 问题描述 js中传递json数据给后端,后端可以正常接收参数,但返回404. js                 function rootConfirm(ids, types) {                     $.tool.confirm("确定结束" + options.modalName + "?&

  • 解决nginx+lua搭建文件上传下载服务问题

    导语 项目需要做一个文件上传下载服务,利用 nginx+lua 做一个代理服务,上传入口统一,分发到不同的机器存储,下载链接和物理存储隔离,支持添加 agent 的方式扩容,这里主要讲一下思路和搭建配置过程,大神勿喷. 主要逻辑 上传 前端请求 nginx 服务, nginx 调用 upload 脚本,脚本通过查找配置,找到对应的逻辑存储路径和物理存储机器的 agent 的 ip 和端口,通过 tcp 发包到对应 agent ,部署在对应机器的 agent 接受数据,并写到本地文件. 下载 ht

  • nginx配置域名访问时域名后出现两个斜杠//的解决方法

    最近这两天重新写了一下我的个人网站,在阿里云新买了一台服务器,配置好以后出现了一个问题,就是输入域名后域名地址会自动在后面追加两个斜杆 并且网站还访问不了,仔细观察nginx配置后发现发现如下 解决办法 我们应该在nginx配置的路径后面加一个/ 配置完成后 保存重启 再次访问 就没有问题了 附配置文件 server { listen 80; server_name wx.pyxrsj.cn; include /etc/nginx/default.d/*.conf; location / { p

  • Nginx中404页面的配置及AJAX请求返回404页面的方法

    404页面基础配置 404错误是WWW网站访问容易出现的错误.最常见的出错提示:404 NOT FOUND.404错误页的设置对网站SEO有很大的影响,而设置不当,比如直接转跳主页等,会被搜索引擎降权拔毛.404页面的目的应该是告诉用户:你所请求的页面是不存在的,同时引导用户浏览网站其他页面而不是关掉窗口离去.搜索引擎通过HTTP状态码来识别网页的状态.当搜索引擎获得了一个错误链接时,网站应该返回404状态码,告诉搜索引擎放弃对该链接的索引.而如果返回200或302状态码,搜索引擎就会为该链接建

  • Nginx配置解决NetCore的跨域问题

    使用Nginx配置解决NetCore的跨域 废话不多说,直接上Nginx配置 server { listen 80; server_name 你的Id或域名; location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,PATCH,OPTIONS'; add_header Access-Control-Allow-Header

  • Nginx解决history模式下页面刷新404问题示例

    目录 前置知识 Nginx location 常用匹配规则 root 与 alias 解决刷新后出现404的问题 总结 前置知识 单页应用(SPA - single page application)只在第一次加载页面时,返回唯一的html页面和它的公共静态资源,后续的页面跳转都不会从服务端拿html文件.(hash和history路由实现浏览器url变化而不刷新页面) hash路由例子:www.baidu.com/#/home, 原本hash是用来结合锚点实现页面试图的控制,当#后面的值发生改

随机推荐