CORS 缺少允许来源
CORS Missing Allow Origin
我的服务器(用 Django
编写)是 运行 在 http://localhost:8000
。
Nuxt
申请 运行 http://localhost:3000
。
当我向服务器发送请求(如 http://localhost:8000/api/v1/user/position/
)时,我在 firefox
浏览器中收到以下错误。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading
the remote resource at http://localhost:8000/api/v1/user/position/.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Firefox:
Chrome:
看到了this link and this但是不知道问题出在哪里?
下面是我的 nuxt.config.js
文件的一部分。
modules: [
'@nuxtjs/axios',
'@nuxtjs/proxy'
],
axios: {
baseURL: 'http://localhost:8000/api/v1/',
},
以及我正在发送请求的函数:
async getAllPosition() {
this.loading_position = true;
await this.$axios.get('user/position/').then(response => {
this.position = response.data;
}).finally(() => {
this.loading_position = false;
})
}
我认为是关于代理的,但我不知道如何配置它。
如错误消息所示:您需要在服务器中指定 Access-Control-Allow-Origin
-header 以允许跨源请求。 (是的 ::3000 和 ::8000 是不同的来源)。现代浏览器将在请求另一个来源时触发一个选项 (pre-flight) 请求来检查 Access-* headers。您必须至少用 Access-Control header 回答这些 OPTIONS
请求。
Access-Control-Allow-Origin: localhost:3000
应该适合开发。
更多关于 CORS 和浏览器 OPTIONS 请求的信息:
https://enable-cors.org/
Why is an OPTIONS request sent and can I disable it?
可以设置正向代理来处理跨域
nuxt.config.js:
export default {
...
proxy: {
'/api': {
target: 'http://localhost:8000',
pathRewrite: {
'^/api': '/api',
changeOrigin: true
}
}
},
}
正如@TMFLGR 提到的:
将 OPTION-Request 处理程序添加到您的服务器并指定 Access-Control-Allow-Origin Header
。代理适用于开发,但在生产中你不应该这样做。
正如@BananaLama and @TMFLGR在他们的回答中提到的那样:
我需要在我的 Django
服务器中指定 Access-Control-Allow-Origin
header 以允许跨源请求。为此,我使用了 django-cors-headers
package.
pip install django-cors-headers
然后在settings.py
部分允许,结果很好返回。
// settings.py
INSTALLED_APPS = [
...
'corsheaders',
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
]
结果:
我的服务器(用 Django
编写)是 运行 在 http://localhost:8000
。
Nuxt
申请 运行 http://localhost:3000
。
当我向服务器发送请求(如 http://localhost:8000/api/v1/user/position/
)时,我在 firefox
浏览器中收到以下错误。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/api/v1/user/position/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Firefox:
Chrome:
看到了this link and this但是不知道问题出在哪里?
下面是我的 nuxt.config.js
文件的一部分。
modules: [
'@nuxtjs/axios',
'@nuxtjs/proxy'
],
axios: {
baseURL: 'http://localhost:8000/api/v1/',
},
以及我正在发送请求的函数:
async getAllPosition() {
this.loading_position = true;
await this.$axios.get('user/position/').then(response => {
this.position = response.data;
}).finally(() => {
this.loading_position = false;
})
}
我认为是关于代理的,但我不知道如何配置它。
如错误消息所示:您需要在服务器中指定 Access-Control-Allow-Origin
-header 以允许跨源请求。 (是的 ::3000 和 ::8000 是不同的来源)。现代浏览器将在请求另一个来源时触发一个选项 (pre-flight) 请求来检查 Access-* headers。您必须至少用 Access-Control header 回答这些 OPTIONS
请求。
Access-Control-Allow-Origin: localhost:3000
应该适合开发。
更多关于 CORS 和浏览器 OPTIONS 请求的信息:
https://enable-cors.org/
Why is an OPTIONS request sent and can I disable it?
可以设置正向代理来处理跨域
nuxt.config.js:
export default {
...
proxy: {
'/api': {
target: 'http://localhost:8000',
pathRewrite: {
'^/api': '/api',
changeOrigin: true
}
}
},
}
正如@TMFLGR 提到的:
将 OPTION-Request 处理程序添加到您的服务器并指定 Access-Control-Allow-Origin Header
。代理适用于开发,但在生产中你不应该这样做。
正如@BananaLama and @TMFLGR在他们的回答中提到的那样:
我需要在我的 Django
服务器中指定 Access-Control-Allow-Origin
header 以允许跨源请求。为此,我使用了 django-cors-headers
package.
pip install django-cors-headers
然后在settings.py
部分允许,结果很好返回。
// settings.py
INSTALLED_APPS = [
...
'corsheaders',
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
]
结果: