Access to XMLHttpRequest at 'http://localhost:9091/User/findByPage/1' from origin 'http://localhost:65128' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
时间: 2023-07-24 14:50:25 浏览: 230
这是一个跨域请求的问题,当前你所在的前端页面在 localhost:65128,尝试去请求 localhost:9091 的接口,但是浏览器的跨域策略阻止了这个请求。解决方法可以在后端接口的响应头中添加 Access-Control-Allow-Origin: *,表示允许任何来源的跨域请求。或者你可以使用 JSONP 或者代理等其他跨域解决方案。
相关问题
Access to XMLHttpRequest at 'http://localhost/media/m1/get' from origin 'http://127.0.0.1:8849' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
<think>嗯,用户遇到了CORS的问题,前端请求被浏览器拦截了。错误信息显示在访问本地服务时,跨域请求被阻止了,因为缺少'Access-Control-Allow-Origin'头。我需要详细分析这个问题,并给出解决方案。
首先,用户是在开发环境下遇到的这个问题,使用本地服务器(127.0.0.1:8849)访问另一个本地服务(localhost)。由于端口不同,浏览器视为跨域请求,触发了CORS策略。需要确认后端服务是否正确设置了CORS响应头。
可能的原因有几个:后端服务没有配置CORS头,或者Nginx作为反向代理时没有正确传递或添加这些头。用户之前配置了Nginx反向代理,可能没有处理CORS相关的配置。
接下来,我需要分步骤给出解决方案。首先应该检查后端服务是否支持CORS,比如在开发环境中,后端框架(如Django、Flask、Spring Boot)可能有相关的中间件或配置。如果后端已经正确配置,那么问题可能出在Nginx的配置上,需要确保Nginx在代理时添加了必要的CORS头。
对于Nginx配置,需要添加如Access-Control-Allow-Origin、Access-Control-Allow-Methods等头。可能需要处理预检请求(OPTIONS方法),设置对应的头信息。同时,需要注意头部的大小写和下划线问题,可能需要配置Nginx忽略或允许这些头部。
另外,如果是开发环境,可以暂时使用浏览器插件禁用CORS,但这只是临时解决方案。长期还是需要正确配置服务器。同时,前端在开发时也可以配置代理,避免跨域问题,比如使用Webpack的devServer代理功能。
还需要提醒用户,生产环境和开发环境的配置可能不同,生产环境需要更严格的安全设置,不能使用通配符*,而应指定具体的域名。
总结步骤:先检查后端配置,再调整Nginx的CORS设置,处理OPTIONS请求,测试配置,最后考虑前端代理或临时解决方案。确保用户能够逐步排查和解决问题,避免遗漏关键点。</think>$\boxed{CORS问题系统解决方案}$
以下是针对「No 'Access-Control-Allow-Origin' header」错误的完整处理指南,包含5个关键修复层级:
---
### 一、核心原理分析
**浏览器安全机制触发条件**:
$$ \text{协议 + 域名 + 端口} \neq \text{当前页面源} \implies \text{CORS拦截} $$
当前案例触发公式:
$$ \text{http://127.0.0.1:8849} \neq \text{http://localhost} $$
---
### 二、分层解决方案
#### 🔧 层级1:后端服务原生支持(推荐)
**SpringBoot示例**:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://127.0.0.1:8849")
.allowedMethods("*")
.allowCredentials(true);
}
}
```
**Django中间件配置**:
```python
# settings.py
CORS_ALLOWED_ORIGINS = [
"http://127.0.0.1:8849",
]
CORS_ALLOW_CREDENTIALS = True
```
---
#### 🔧 层级2:Nginx代理层修复(生产环境常用)
```nginx
server {
listen 80;
server_name localhost;
location /media/ {
# 核心CORS头配置
add_header 'Access-Control-Allow-Origin' 'http://127.0.0.1:8849';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type';
add_header 'Access-Control-Allow-Credentials' 'true';
# 处理预检请求
if ($request_method = OPTIONS) {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://backend_server;
}
}
```
---
#### 🔧 层级3:前端工程配置(开发环境快速解决)
**Webpack DevServer代理**:
```javascript
// vue.config.js
module.exports = {
devServer: {
proxy: {
'/media': {
target: 'http://localhost',
changeOrigin: true,
pathRewrite: { '^/media': '' }
}
}
}
}
```
---
#### 🔧 层级4:浏览器临时绕过(仅调试用)
**Chrome启动参数**:
```bash
# Windows
chrome.exe --disable-web-security --user-data-dir="C:/Temp"
# macOS
open -n -a Google\ Chrome --args --disable-web-security --user-data-dir=/tmp/chrome
```
---
#### 🔧 层级5:代码层强制处理(应急方案)
```javascript
// Axios全局配置
axios.defaults.withCredentials = true;
// Fetch API设置
fetch(url, {
mode: 'cors',
credentials: 'include'
})
```
---
### 三、深度调试技巧
#### 1. 预检请求检测
使用Chrome开发者工具 → Network标签:
- 确认存在`OPTIONS`预请求
- 检查响应头是否包含:
```http
Access-Control-Allow-Origin: http://127.0.0.1:8849
Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
```
#### 2. 头信息验证命令
```bash
curl -I -X OPTIONS http://localhost/media/m1/get \
-H "Origin: http://127.0.0.1:8849" \
-H "Access-Control-Request-Method: GET"
Access to XMLHttpRequest at 'http://localhost:8082/api/user/login' from origin 'http://localhost:9527' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
这个错误提示是因为浏览器的同源策略(Same Origin Policy)限制了跨域请求。简单来说,浏览器不允许从一个源(域名、协议、端口)发送请求到另一个源。如果需要进行跨域请求,可以在服务端设置响应头部中的“Access-Control-Allow-Origin”字段,来允许特定的源进行访问。具体实现可以参考CORS(Cross-Origin Resource Sharing)协议。
阅读全文
相关推荐
















