记:vite3+vue3+axios前端项目跨域问题解决【前端和服务器nginx配置】

这篇具有很好参考价值的文章主要介绍了记:vite3+vue3+axios前端项目跨域问题解决【前端和服务器nginx配置】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:什么是跨域,网上一搜一大把,所以这里直接跳过,直入主题。

处理方式:不通过后端处理跨域,通过前端+服务器nginx处理。

1.前端涉及处理跨域的必要配置(开发环境、生产环境):vite3、vue3、axios

2.服务器涉及处理跨域的配置(生产环境):nginx【主要用到其配置文件nginx.conf】

3.配置开发环境【跟目录下分别创建:.env.development、.env.production】

        .env.development内容如下:

VITE_APP_PROXY_BASE_API='/proxyCustomerApi-dev'

        .env.production内容如下:

VITE_APP_PROXY_BASE_API='/proxyCustomerApi-pro'

     tips: .env.development、.env.production中的常量命名须以"VITE_"开头,这里定义的常量为VITE_APP_PROXY_BASE_API,值分别为"/proxyCustomerApi-dev"、"/proxyCustomerApi-pro"用以区分开发环境和生产环境,值可自定义为"/+自己想定义的内容"

4.前端vite.config.js中添加如下代码(代码中有相关注释):

import { defineConfig, loadEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
import * as path from 'path';
... ...

export default defineConfig((env) => {
    // 获取到当前开发模式(dev/pro)下对应的环境文件对象值
	const evnMap = loadEnv(env.mode, process.cwd());
	// console.log(`evnMap = ${JSON.stringify(evnMap)}`);
	return {
		... ...
		server: {
			host: '0.0.0.0', // ip地址
			port: 8088, // 启动端口
			// 反向代理配置,注意rewrite写法,开始没看文档在这里踩了坑
			proxy: {
				// 本地开发环境通过代理实现跨域,生产环境使用 nginx 转发
				// 对应项目根目录 - [.env.development、.env.production]文件中的值
				[evnMap.VITE_APP_PROXY_BASE_API]: {
					target: 'http://xxx.xx.xx.xx:27005', // 请求报跨域错误的接口域名地址,真实请求地址
					changeOrigin: true, // 支持跨域
					rewrite: (path) =>
						path.replace(new RegExp('^' + evnMap.VITE_APP_PROXY_BASE_API), ''), // 重写真实路径,替换/api
					bypass: (req, res, options) => {
						const proxyUrl = options.target + options.rewrite(req.url);
						console.log(`真实请求的完整地址proxyUrl: ${proxyUrl}`);
					},
				},
			},
		},
	};
});

5.在自己封装好的axios js文件中修改下axios.create中的配置,代码如下:

const http = axios.create({
	// baseURL: DOMAIN,
	// import.meta.env.VITE_APP_PROXY_BASE_API 对应项目根目录 - [.env.development、.env.production]文件中的值
	baseURL: import.meta.env.VITE_APP_PROXY_BASE_API,
	timeout: 600000,
    ... ...
});

export default http;

6.在自己出现跨域报错的接口处修改成类似如下代码片段:

export const chatHistoryRecordApi = {
	// 获取所有客服与用户对话列表
	getAllCustomerChatListPage: (params) => {
		return http({
			// import.meta.env.VITE_APP_PROXY_BASE_API 对应项目根目录 - [.env.development、.env.production]文件中的值
			baseURL: import.meta.env.VITE_APP_PROXY_BASE_API,
			url: `/customer/allChatList`,
			method: 'get',
			params,
		});
	},
	// 查询指定对话的聊天历史记录
	queryCurrentChatHistory: (params) => {
		return http({
			// import.meta.env.VITE_APP_PROXY_BASE_API 对应项目根目录 - [.env.development、.env.production]文件中的值
			baseURL: import.meta.env.VITE_APP_PROXY_BASE_API,
			url: `/customer/chatHistory`,
			method: 'get',
			params,
		});
	},
};

至此前端跨域配置部分处理完成,可以调试开发环境【本地调试】了。

确保根目录下的package.json文件中存在scripts标签配置:

{
	"name": "hrosass",
	"private": true,
	"version": "0.0.0",
	"type": "module",
	"scripts": {
        // dev、build系统会默认添加--mode production/development环境配置
        // "dev": "vite" =》"dev": "vite --mode development"
        // "build": "vite build" =》"build": "vite build --mode production"
		"dev": "vite",
		"build": "vite build",
        ... ...
	},
	"dependencies": {
		... ...
	},
	"devDependencies": {
		... ...
	},
	"main": "index.js",
	... ...
}

本地调试命令行中执行(我项目是用的yarn来运行):yarn run dev,发现接口可以请求拿到数据了。但在线上生产环境下还是会报错,如果只需要本地调试那到这里就完成了!!!

接下来处理生产环境(线上模式)下的跨域报错问题,由于刚刚前端的配置中已经加上了对生产环境的代理配置,其实也就是根目录下的这个文件【.env.production】。

7.本地连接上服务器,且服务器已配置好Nginx,找到Nginx的运行配置文件【nginx.conf】,内容大致如下(注意看注释):

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;


# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    client_max_body_size 20M;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

		map $http_upgrade $connection_upgrade {
		default upgrade;
		'' close;
		}

  # 加载vue前端项目的server
  server {
        listen       3004; # 端口
        server_name  localhost; # 域名
        location / {
            root  /home/view/wallet/dist/; # 打包vue项目后的dist存放路径
            index  index.html index.htm; # 加载入口html文件
            try_files  $uri  $uri/  /index.html;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

8.往server { location / { } }下边添加如下location反向代理配置(注意看注释):

# /proxyCustomerApi-pro为前端 .env.production中的指定的值
location /proxyCustomerApi-pro {
            # 解决跨域
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Authorization,Refreshtoken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type' always;
            # 设置 options 请求处理
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*' always;
                add_header 'Access-Control-Max-Age' 1728000 always;
                add_header 'Content-Type' 'text/plain; charset=utf-8' always;
                add_header 'Content-Length' 0 always;
                # 对于Options方式的请求返回200或其它码,表示接受跨域请求
                return 200;
            }
            # 设置反向代理 http://://xxx.xx.xx.xx:27005不加/会拼上/proxyCustomerApi-pro 加/不会拼/proxyCustomerApi-pro 由于真实接口请求中没有/proxyCustomerApi-pro这段 这里不需要拼上 代理服务地址后应添加/   http://xxx.xx.xx.xx:27005/
            proxy_pass http://://xxx.xx.xx.xx:27005/; # 后端API地址 引起跨域报错的api请求地址
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
            proxy_send_timeout 600;
            proxy_buffer_size 64k;
            proxy_buffers 4 64k;
            proxy_busy_buffers_size 128k;
            proxy_temp_file_write_size 128k;
            # 缓存时间,单位秒。这里设置的是6小时
            expires 21600s;
            # 收到304响应后,再次请求的时间间隔
            proxy_cache_valid 200 304 12h;
        }

9.配置后的nginx.conf完整内容如下:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;


# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    client_max_body_size 20M;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

		map $http_upgrade $connection_upgrade {
		default upgrade;
		'' close;
		}

  # 加载vue前端项目的server
  server {
        listen       3004; # 端口
        server_name  localhost; # 域名
        location / {
            root  /home/view/wallet/dist/; # 打包vue项目后的dist存放路径
            index  index.html index.htm; # 加载入口html文件
            try_files  $uri  $uri/  /index.html;
        }
        # /proxyCustomerApi-pro为前端 .env.production中的指定的值
        location /proxyCustomerApi-pro {
            # 解决跨域
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Authorization,Refreshtoken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type' always;
            # 设置 options 请求处理
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*' always;
                add_header 'Access-Control-Max-Age' 1728000 always;
                add_header 'Content-Type' 'text/plain; charset=utf-8' always;
                add_header 'Content-Length' 0 always;
                # 对于Options方式的请求返回200或其它码,表示接受跨域请求
                return 200;
            }
            # 设置反向代理 http://://xxx.xx.xx.xx:27005不加/会拼上/proxyCustomerApi-pro 加/不会拼/proxyCustomerApi-pro 由于真实接口请求中没有/proxyCustomerApi-pro这段 这里不需要拼上 代理服务地址后应添加/   http://xxx.xx.xx.xx:27005/
            proxy_pass http://://xxx.xx.xx.xx:27005/; # 后端API地址 引起跨域报错的api请求地址
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
            proxy_send_timeout 600;
            proxy_buffer_size 64k;
            proxy_buffers 4 64k;
            proxy_busy_buffers_size 128k;
            proxy_temp_file_write_size 128k;
            # 缓存时间,单位秒。这里设置的是6小时
            expires 21600s;
            # 收到304响应后,再次请求的时间间隔
            proxy_cache_valid 200 304 12h;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

10.执行nginx命令【sudo service nginx reload】使配置生效,至此线上生产环境跨域配置完成。

调试线上跨域问题是否解决,前端项目执行:yarn run build打包线上版本生成dist文件夹并上传到服务器,刷新线上网址发现接口可以请求拿到数据了。文章来源地址https://www.toymoban.com/news/detail-791298.html

到了这里,关于记:vite3+vue3+axios前端项目跨域问题解决【前端和服务器nginx配置】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3项目创建(vite3+ts+elementui-plus)

    目的:vue3+vite+ts 安装依赖,安装vite的工具 Vite下一代的前端工具链为开发提供极速响应v4.3 创建工程 –template vue-ts 后面的是配置模板,有很多,也有react,官网有介绍 启动工程 安装路由 配置vite-env.d.ts 为了让ts识别.vue文件 安装element-plus 注意vue3用的是element-plus别装错版本了

    2024年02月16日
    浏览(54)
  • 【Vue.js】Vue3全局配置Axios并解决跨域请求问题

    对于前后端分离项目,前端和后端端口不能重复,否则会导致前端或者后端服务起不来。例如前端访问地址为: http://localhost:8080/ ,后端访问地址为 http://localhost:8081/ 。后端写好Controller,当用Axios访问该接口时,将会报错: Access to XMLHttpRequest at \\\' http://localhost:8081/login \\\' from

    2024年02月05日
    浏览(80)
  • Soybean Admin - 基于 Vue3 / vite3 等最新前端技术栈构建的中后台模板,免费开源、清新优雅,主题丰富

    一款专业好看、完成度很高的 admin 开源项目,无论是用于生产还是学习,都非常值得尝试。 关于 Soybean Admin Soybean Admin 是一个基于 Vue3 / Vite3 / TypeScript / NaiveUI / Pinia 和 UnoCSS 的中后台模版,它使用了最新流行的前端技术栈,内置丰富的主题配置,有着极高的代码规范,基于文

    2024年02月11日
    浏览(58)
  • 解决Vue3+Vite3 打包部署到nginx后配置非根目录刷新页面报错空白

    报错内容 解决方法 router文件 vite.config.ts nginx.conf 配置中路径apps是我自建的存放前端页面的文件夹 起关键作用的是 try_files $uri $uri/ /demo/index.html ,当然上面项目文件夹demo也需保持一致 alias 后面的路径是Vue项目打包后dist静态文件服务器存放路径,一般在nginx下面建一个文件夹

    2024年02月11日
    浏览(58)
  • vue项目使用vite设置proxy代理,vite.config.js配置,解决本地跨域问题

    非同源请求,也就是协议(protocol)、端口(port)、主机(host)其中一项不相同的时候,这时候就会产生跨域 vite的proxy代理和vue-cli的proxy大致相同,需要在vite.config.js文件中配置(打包配置也在此) 代理配置在server中,可以上vite官网服务器选项查看server.proxy代码示例:开发服务器选

    2024年01月21日
    浏览(59)
  • vue3+vite项目跨域配置(踩坑无数篇)

    写这篇多少有点心情复杂,毕竟因为一个巨巨巨巨没意思的bug卡了两整天… 废话不多说啦,开篇入题叭,希望大家都能改好自己的bugggggg!!! 1.vite.config.js配置 注意:因为我是用 vite 创建的,不是vue-cli,当时搜了好多教程都教的是新建一个vue.config.js,发现根本没有生效,

    2024年02月05日
    浏览(39)
  • vue3 vite配置跨域以及不生效问题

    1. 在vite.config中添加配置 2. 在.env.development中配置开发环境下的基地址(没有该文件夹手动新建) 3. 配置axios的基地址 最后:         我之前是犯过一个错误的, 导致我搞了半天都没搞好... 就是配置完vite.config, 那个/ccc后缀是接口没有的自己加的, 那么就要手动加上去了...     

    2024年02月11日
    浏览(47)
  • vue3初始搭建项目完整教程 vue3 + vite + element-ui + axios

    1. 安装 2. 创建目录 3. 在router下新增index.js 4.修改main.ts 1. 新增文件夹 2. 新增Home.vue和About.vue 1. 修改app.vue 1.unplugin-auto-import 2. 在vite.config.js中引入 1.安装element-ui 2. 按需导入 3.在vite.config.js新增插件 4.测试是否引入成功 5.如果报错 1. 网上下载reset.css 2.在assets中新增css文件夹 3.将

    2024年02月16日
    浏览(85)
  • 新建vite+vue3+ts项目,以及解决过程中遇到的问题

    目录 一、新建vite+vue3+ts项目 二、解决过程中遇到的问题 解决报错:Module ‘“xx.vue“‘ has no default export. 解决报错:Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid’ imported from xxx的解决 解决报错:[plugin:vite:css] Preprocessor dependency \\\"less\\\" not found. Did you install it? 此处我使用npm做一下

    2024年02月06日
    浏览(135)
  • vite3、vue 项目打包分包进阶-组件分包

    在上次的分包实战后,我在服务器上测试了分包后的项目效果很好,但是还不够理想,因为在我的Login页面我使用的动态组件,其中包含注册组件register、忘记密码组件renew,我们知道vite的打包机制是由各个分入口汇总到一个总文件,那么我们该怎么做呢? vite打包实战,在这篇

    2023年04月23日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包