nginx代理跨域

nginx

nginx的认识

首先nginx官方文档网站:nginx 文档

教程:https://www.w3schools.cn/nginx/nginx_command_conf.html

  • nginx是什么?

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。

  • nginx能干什么?

Nginx 不仅提供了 Web 服务器的功能,还极大满足了这一主流架构的需求并提供了如下应用特性。

① 访问路由

现今大型网站的请求量早已不是单一 Web 服务器可以支撑的了。单一入口、访问请求被分配到不同的业务功能服务器集群,是目前大型网站的通用应用架构。Nginx 可以通过访问路径、URL 关键字、客户端 IP、灰度分流等多种手段实现访问路由分配。

② 反向代理

就反向代理功能而言,Nginx 本身并不产生响应数据,只是应用自身的异步非阻塞事件驱动架构,高效、稳定地将请求反向代理给后端的目标应用服务器,并把响应数据返回给客户端。其不仅可以代理 HTTP 协议,还支持 HTTPS、HTTP/2、FastCGI、uWSGI、SCGI、gRPC 及 TCP/UDP 等目前大部分协议的反向代理。

③ 负载均衡

Nginx 在反向代理的基础上集合自身的上游(upstream)模块支持多种负载均衡算法,使后端服务器可以非常方便地进行横向扩展,从而有效提升应用的处理能力,使整体应用架构可轻松应对高并发的应用场景。

④ 内容缓存

动态处理与静态内容分离是应用架构优化的主要手段之一,Nginx 的内容缓存技术不仅可以实现预置静态文件的高速缓存,还可以对应用响应的动态结果实现缓存,为响应结果变化不大的应用提供更高速的响应能力。

⑤ 可编程

Nginx 模块化的代码架构方式为其提供了高度可定制的特性,但可以用C语言开发 Nginx 模块以满足自身使用需求的用户只是少数。Nginx 在开发之初就具备了使用 Perl 脚本语言实现功能增强的能力。Nginx 对 JavaScript 语言及第三方模块对 Lua 语言的支持,使得其可编程能力更强。

nginx使用

下载安装(window版本)

运行指令

指令介绍

nginx version: nginx/1.25.3
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: NONE)
  -e filename   : set error log file (default: logs/error.log)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file

-?,-h:查看帮助

-v:显示版本信息并退出

-V:显示版本和配置选项信息,然后退出

-t:检测配置文件是否有语法错误,然后退出

-T:检测配置文件语法,打印它并退出

-q:在配置测试期间,禁止显示非错误信息

-s:发送信号给主进程,stop 强制退出,quit 优雅的退出,reopen 重启,reload 重新加载配置

-p:设置 nginx 目录

-c:指定启动使用的配置文件(常用)

-g:在配置文件之外设置全局指令

  • 注意如果指令关不了,直接杀进程。

http 配置

通过反向代理配置跨域请求头。

注意:nginx配置前提是服务端不设置

跨域主要涉及4个响应头:

Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证)

Access-Control-Allow-Headers 跨域允许携带的特殊头信息字段 (只在预检请求验证)

Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词 (只在预检请求验证)

Access-Control-Allow-Credentials 是否允许跨域使用cookies,如果要跨域使用cookies,可以添加上此请求响应头,值设为true(设置或者不设置,都不会影响请求发送,只会影响在跨域时候是否要携带cookies,但是如果设置,预检请求和正式请求都需要设置)。不过不建议跨域使用(项目中用到过,不过不稳定,有些浏览器带不过去),除非必要,因为有很多方案可以代替。

一般请求解决跨域:

    server {
        listen       777;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

          location / {
              add_header Access-Control-Allow-Origin '*';
              if ($request_method = 'OPTIONS') {
                return 204;
           }
            proxy_pass http://localhost:666;
        }

    }

预检请求解决跨域:

    server {
        listen       777;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

          location / {
              add_header Access-Control-Allow-Origin '*' always;
              if ($request_method = 'OPTIONS') {         
              add_header Access-Control-Allow-Headers 'token';//预检请求的产生条件。即有请求头的请求。
              add_header Access-Control-Allow-Origin '*';
              return 204;
           }
            proxy_pass http://localhost:666;
        }

    }
  • 只要if ($request_method = ‘OPTIONS’) 里面写了 add_header 则必须在作用域里重新添加跨域请求头。

官方文档是这样说的:

There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.

意思就是当前层级无 add_header 指令时,则继承上一层级的add_header。相反的若当前层级有了add_header,就应该无法继承上一层的add_header。

  • add_header 指令用于添加返回头字段,当且仅当状态码为特定时有效。如果想要每次响应信息都携带头字段信息,需要在最后添加always(经我测试,只有Access-Control-Allow-Origin这个头信息需要加always,其他的不加always也会携带回来)。

前端:

      this.$axios({
        methods: "post",
        url: "http://localhost:777/api/getList",
        headers:{
          token:'asdfghj'
        }
      }).then((data) => {
        console.log(data);
      });
  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值