Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Intercambio de recursos entre dominios (CORS, intercambio de recursos entre orígenes) son un desafío común en el desarrollo front-end. Este artículo presentará en detalle soluciones en diferentes entornos (como proyectos Vue3 + Vite, proyectos jQuery y otros entornos).
La esencia del problema entre dominios es que el navegador restringe la carga de recursos de una fuente (dominio, protocolo, puerto) a otra fuente por razones de seguridad. Este mecanismo de seguridad se denomina "política del mismo origen". La misma política de origen estipula que el navegador permitirá que la solicitud pase solo si la URL solicitada tiene el mismo protocolo, nombre de dominio y puerto que la URL de la página web actual.
Falta de encabezados CORS:
El servidor no configuró los encabezados de respuesta CORS correctos, lo que provocó que el navegador rechazara la solicitud.Por ejemplo, el navegador espera que la respuesta del servidor contengaAccess-Control-Allow-Origin
encabezado, si este encabezado no está configurado, el navegador bloqueará la solicitud.
Las solicitudes de origen cruzado están prohibidas:
De forma predeterminada, los navegadores bloquean las solicitudes de origen cruzado para proteger la seguridad de los usuarios. Si el servidor no permite el acceso a un dominio específico, el navegador arrojará un error CORS.
Error en la solicitud de verificación previa:
Para algunas solicitudes complejas, el navegador enviará una solicitud de verificación previa (solicitud de OPCIONES) para confirmar si el servidor permite la solicitud. Si la solicitud de verificación previa falla, se producirá un error CORS.
A través de la función de proxy del servidor de desarrollo de Vite, las solicitudes locales se pueden enviar a diferentes servidores para evitar problemas entre dominios. Estos son los pasos específicos:
npm create vite@latest
cd your-project-name
npm install
Seleccione la plantilla Vue3 e ingrese al directorio del proyecto.
Encontrado en el directorio raíz del proyecto Vite.vite.config.ts
(ovite.config.js
), y realice la siguiente configuración:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [vue()],
server: {
proxy: {
'/api': {
target: 'http://api.example.com', // 目标服务器
changeOrigin: true, // 是否改变请求源
rewrite: (path) => path.replace(/^/api/, ''), // 重写路径
},
},
},
});
En el componente Vue, puedes pasaraxios
ofetch
Enviar petición. Por ejemplo:
<template>
<div>
<button @click="fetchData">获取数据</button>
<div v-if="data">{{ data }}</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import axios from 'axios';
export default defineComponent({
setup() {
const data = ref(null);
const fetchData = async () => {
try {
const response = await axios.get('/api/data');
data.value = response.data;
} catch (error) {
console.error('请求错误:', error);
}
};
return {
data,
fetchData,
};
},
});
</script>
En proyectos jQuery, los problemas de CORS se pueden resolver configurando encabezados de solicitud o usando JSONP.
Asegúrese de que el servidor tenga configurados los encabezados CORS correctos, como Access-Control-Allow-Origin
. Cuando el cliente inicia una solicitud:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$.ajax({
url: 'http://api.example.com/data',
method: 'GET',
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.error('请求错误:', error);
}
});
</script>
Si el servidor admite JSONP, los problemas entre dominios se pueden resolver de las siguientes maneras:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$.ajax({
url: 'http://api.example.com/data',
method: 'GET',
dataType: 'jsonp', // 使用JSONP
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.error('请求错误:', error);
}
});
</script>
En muchos casos, se puede configurar un proxy en el lado del servidor para reenviar solicitudes entre dominios a través del lado del servidor.Por ejemplo, en Node.js puedes usarhttp-proxy-middleware
:
const { createProxyMiddleware } = require('http-proxy-middleware');
app.use('/api', createProxyMiddleware({
target: 'http://api.example.com',
changeOrigin: true,
pathRewrite: {
'^/api': '',
},
}));
Asegúrese de que se incluyan los encabezados CORS correctos en la respuesta del servidor. Por ejemplo, en Node.js + Express:
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
app.get('/data', (req, res) => {
res.json({ message: 'Hello World' });
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
En Nginx, los problemas de CORS se pueden resolver configurando el proxy:
server {
listen 80;
server_name yourdomain.com;
location /api/ {
proxy_pass http://api.example.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
El problema de CORS esDesarrollo front-end Un desafío común, pero que se puede resolver de manera efectiva con la configuración adecuada del proxy y del servidor. En diferentes entornos, puede utilizar la función de proxy de Vite, configurar encabezados de solicitud, JSONP, proxy del lado del servidor, proxy Nginx y otros métodos para resolver problemas entre dominios. Espero que este artículo le ayude a comprender y resolver los problemas de CORS.