前端 vite 跨域配置 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘

跨域

是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。


vite 跨域代理

把对某一段 URL 的访问直接转换成另一个真实的后端 API 地址,这样前后端就视为使用了相同的域名、协议和端口,就避免了跨域的问题,还能避免繁琐的反复编写域名

server.proxy 为开发服务器配置自定义代理规则

官方示例


export default defineConfig({
  server: {
    proxy: {
      // 字符串简写写法
      '/foo': 'http://localhost:4567',
      // 选项写法
      '/api': {
        target: 'http://jsonplaceholder.typicode.com',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      },
      // 正则表达式写法
      '^/fallback/.*': {
        target: 'http://jsonplaceholder.typicode.com',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/fallback/, '')
      },
      // 使用 proxy 实例
      '/api': {
        target: 'http://jsonplaceholder.typicode.com',
        changeOrigin: true,
        configure: (proxy, options) => {
          // proxy 是 'http-proxy' 的实例
        }
      },
      // Proxying websockets or socket.io
      '/socket.io': {
        target: 'ws://localhost:3000',
        ws: true
      }
    }
  }
})

上面是官方给出的设置代理的几种方式,对于初学者来说,可能理解的不是很深刻;
这里我直接用我的项目实例来掩饰一下;我的项目用的是axios
export default defineConfig({
  plugins: [vue()],
  //解决“vite use `--host` to expose”
  server: {
    host: '0.0.0.0',
    // port: 8080,      
    open: true,
    proxy: {
      "/neimenmenhuan": {  //服务器接口路径地址,根据路径设置
        target: "http://xxx.xx.x.xx:8080",  //你的服务器地址
        changeOrigin: true,  // 允许跨域
        rewrite: (path) => path.replace(/^\/neimenmenhuan/), // 重写路径把路径变成空字符,(我理解的意思是:baseURL: '/neimenmenhuan/' 配置了,子接口 url: 'neimenmenhuan/settings/qx/user' 也可以正常访问,但是理解的很粗略,希望得到一个透彻的答案;
      },
    },
  },
 }
axios 文件
import axios from 'axios'
// 创建一个 axios 实例
const service = axios.create({
    baseURL: '/neimenmenhuan/', // 所有的请求地址前缀部分
    timeout: 60000, // 请求超时时间毫秒
    headers: { 
        // 设置后端需要的传参类型
        'Content-Type':'application/json;charset=UTF-8'
    },
})

子接口模块

import httpRequest from '@/axios/index'

// 获取用户信息
export function apiGetUserInfo(param) {
    return httpRequest({
        url: 'neimenmenhuan/settings/qx/user/sendNM.do',
        method: 'post',
        data: param
    })
}

然后页面导入使用,就可以解决跨域问题啦

<think>好的,我现在需要帮用户解决CORS策略阻止XMLHttpRequest请求的问题。用户之前已经得到了详细的解决方案,现在再次提问,可能是需要更简明的回答或者之前的方法遇到了问题。首先,我得回顾之前的对话,确保这次回答一致且补充必要的信息。 用户提到CORS policy blocking XMLHttpRequest,具体错误是Access-Control-Allow-Origin头缺失。根据之前的回答,解决方案包括服务器配置、前端调整和开发环境处理。现在需要确认用户是否尝试过这些方法,但用户没有具体反馈,所以可能需要更清晰的步骤。 另外,用户引用了关于CORS-RFC1918的内容,说明可能涉及私有网络访问的问题,特别是在Chrome 98+版本中需要Access-Control-Allow-Private-Network头。这点需要在回答中强调,特别是服务器配置部分。 用户可能需要分步骤的解决方案,按优先级排列。比如,首选服务器端配置,其次是前端代理,最后是临时解决方案如浏览器插件或禁用安全策略。需要确保每个步骤都有示例代码,方便用户实施。 还要注意用户可能的开发环境,比如是否使用本地服务器(如Vite或Webpack),或者直接通过文件协议打开页面。如果是后者,建议改用开发服务器,并配置代理,避免CORS问题。 另外,用户可能对如何验证CORS头是否生效感兴趣,可以在相关问题中提及使用curl或浏览器开发者工具检查响应头。生产环境的设置也需要提醒,避免使用通配符*,应指定具体域名。 最后,确保回答结构清晰,使用代码块和项目符号,便于用户理解。同时,检查是否有遗漏的细节,比如预检请求的处理,或者HTTPS配置的问题,这些可能需要补充说明。</think>以下是针对CORS策略阻止XMLHttpRequest请求的**完整解决方案**,包含关键配置细节和优先推荐顺序: --- ### 一、核心解决思路(按优先级排序) | 方案类型 | 适用场景 | 安全性 | 实现难度 | |----------------|--------------------------|--------|----------| | 服务端配置 | 生产/开发环境 | 高 | 中等 | | 前端代理 | 开发环境 | 高 | 低 | | 浏览器插件 | 临时测试 | 低 | 极低 | | 禁用安全策略 | 紧急调试 | 危险 | 低 | --- ### 二、服务端必须配置的响应头(强制要求) ```http Access-Control-Allow-Origin: [具体域名|*] # 生产环境禁止使用* Access-Control-Allow-Methods: GET, POST, OPTIONS Access-Control-Allow-Headers: Content-Type, Authorization Access-Control-Allow-Credentials: true # 如需携带cookie必须设置 Access-Control-Allow-Private-Network: true # Chrome 98+私有网络要求[^1] ``` #### 框架配置示例: **1. Node.js (Express)** ```javascript const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors({ origin: 'http://localhost:3000', // 指定前端地址 methods: ['GET', 'POST', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true, exposedHeaders: ['X-Custom-Header'] })); // 显式处理OPTIONS预检请求 app.options('*', cors()); ``` **2. Spring Boot (Java)** ```java @Configuration public class CorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true) .exposedHeaders("X-Custom-Header"); } }; } } ``` --- ### 三、前端工程化解决方案(推荐开发环境使用) **1. Vite代理配置** ```javascript // vite.config.js export default defineConfig({ server: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } } } }) ``` **2. Axios全局配置** ```javascript axios.defaults.withCredentials = true; // 携带cookie时需要 axios.interceptors.request.use(config => { config.headers['Content-Type'] = 'application/json'; return config; }); ``` --- ### 四、应急处理方案(仅限本地测试) **1. 使用CORS浏览器插件** 安装官方扩展[Allow CORS: Access-Control-Allow-Origin](https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf),启用后需: 1. 点击插件图标打开控制面板 2. 开启`Enable CORS`和`Enable CORS for private networks`[^1] **2. 启动浏览器时禁用安全策略** ```bash # Windows chrome.exe --disable-web-security --user-data-dir="C:/TempChrome" # macOS open -n -a "Google Chrome" --args --disable-web-security --user-data-dir="/tmp/chrome" ``` --- ### 五、特殊场景处理 **1. 带Cookie的域请求** 必须同时满足: - 服务端设置`Access-Control-Allow-Credentials: true` - 前端设置`withCredentials: true` - Access-Control-Allow-Origin**不能**使用通配符`*` **2. WebSocket域问题** 在服务端添加: ```http Access-Control-Allow-Origin: [具体域名] Sec-WebSocket-Protocol: chat ``` --- ### 验证配置是否生效 ```bash # 使用curl测试响应头 curl -I -X OPTIONS http://localhost:8080/hlsys/getUsers # 预期返回包含: HTTP/1.1 204 No Content Access-Control-Allow-Origin: http://localhost:3000 Access-Control-Allow-Methods: GET,POST,OPTIONS Access-Control-Max-Age: 86400 ``` --- ### 生产环境最佳实践 1. **严格限制来源域名** ```http Access-Control-Allow-Origin: https://your-production-domain.com ``` 2. **启用CORS预检缓存** ```http Access-Control-Max-Age: 86400 # 24小时缓存 ``` 3. **监控CORS错误** 在前端添加错误捕获: ```javascript window.addEventListener('error', (err) => { if (err.message.includes('CORS')) { // 上报到监控系统 } }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Min;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值