如何正确设置 CORS 设置
How to setup CORS setup correctly
我们有一个旧的 SharePoint 2010 服务器,我们想从那里请求网络内的数据。
我已经知道由于 CORS,我无法从其他服务器请求数据,但实际上据我了解,有可能允许此类请求。因此我需要修改服务器 HTTP 响应 headers,对吗?
我有这个设置,但实际上没有用。
服务器 - SharePoint 2010 - IIS:
我已将 Access-Control-Allow-Origin
设置为我笔记本的名称 (grolne-nb090)。在 JavaScript 应用程序中,我定义了以下请求:
onButtonClickHandler(event) {
event.preventDefault();
fetch('https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test', {
method: 'GET',
mode: 'cors',
headers: {
'Access-Control-Allow-Origin': 'http://grolne-nb090:3000',
'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, POST, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type,Authorization,Accept',
'Content-Type': 'application/json', //'text/plain', //
'Accept': 'application/json'
},
credentials: 'include'
})
.then((response) => {
console.log('fetch data', response);
return response.json();
})
.then((data) => {
console.log('data',data);
})
.catch((error) => {
console.error('Error on fetch request:', error);
});
}
目前的错误信息是这样的:
Access to fetch at
'https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test'
from origin 'http://grolne-nb090:3000' has been blocked by CORS
policy: Response to preflight request doesn't pass access control
check: It does not have HTTP ok status.
如果我将 mode
更改为 no-cors
,我会得到一个 opaque
答案。
如何正确设置服务器/应用程序,以便我可以访问这些数据?我需要在服务器端设置哪个 HTTP 响应 headers 以及 JavaScript 请求是什么样子的?
一想,请求者URL也必须使用HTTPS吗?这会成为问题吗?
更新
我在谷歌上搜索了很多,似乎对 SharePoint 服务器的请求需要身份验证,而 pre-flight 没有提供。所以来自 SharePoint 的答案似乎是 pre-flight 的 401 Unauthorized
,这会导致整个请求崩溃。
现在我正在搜索如何禁用单个 SharePoint 页面的身份验证...(或者如果可能的话)
我能够解决问题。
问题是,SharePoint 需要身份验证,而 pre-flight 中没有提供。所以 pre-flight 得到 401 Unauthorized
并且整个请求失败。
于是又看了一遍Mozilla的文章...
https://developer.mozilla.org/de/docs/Web/HTTP/CORS
... 并看到 pre-flight 没有在 simple requests
上完成(有关 simple requests
的详细信息,请参阅上面的 link)。
所以我这样更改了代码:
fetch('https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test', {
method: 'GET',
mode: 'cors',
headers: {
'Content-Type': 'text/plain',
'Accept': 'application/json'
},
credentials: 'include'
})
本例中的"magic"就是'Content-Type': 'text/plain'
。然后请求被处理为 simple request
并且没有 pre-flight 发生。
我在 IIS
中设置的 HTTP 响应 headers 以这种方式工作,正如您在开头 post.
中看到的那样
我们有一个旧的 SharePoint 2010 服务器,我们想从那里请求网络内的数据。
我已经知道由于 CORS,我无法从其他服务器请求数据,但实际上据我了解,有可能允许此类请求。因此我需要修改服务器 HTTP 响应 headers,对吗?
我有这个设置,但实际上没有用。
服务器 - SharePoint 2010 - IIS:
我已将 Access-Control-Allow-Origin
设置为我笔记本的名称 (grolne-nb090)。在 JavaScript 应用程序中,我定义了以下请求:
onButtonClickHandler(event) {
event.preventDefault();
fetch('https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test', {
method: 'GET',
mode: 'cors',
headers: {
'Access-Control-Allow-Origin': 'http://grolne-nb090:3000',
'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, POST, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type,Authorization,Accept',
'Content-Type': 'application/json', //'text/plain', //
'Accept': 'application/json'
},
credentials: 'include'
})
.then((response) => {
console.log('fetch data', response);
return response.json();
})
.then((data) => {
console.log('data',data);
})
.catch((error) => {
console.error('Error on fetch request:', error);
});
}
目前的错误信息是这样的:
Access to fetch at 'https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test' from origin 'http://grolne-nb090:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
如果我将 mode
更改为 no-cors
,我会得到一个 opaque
答案。
如何正确设置服务器/应用程序,以便我可以访问这些数据?我需要在服务器端设置哪个 HTTP 响应 headers 以及 JavaScript 请求是什么样子的?
一想,请求者URL也必须使用HTTPS吗?这会成为问题吗?
更新
我在谷歌上搜索了很多,似乎对 SharePoint 服务器的请求需要身份验证,而 pre-flight 没有提供。所以来自 SharePoint 的答案似乎是 pre-flight 的 401 Unauthorized
,这会导致整个请求崩溃。
现在我正在搜索如何禁用单个 SharePoint 页面的身份验证...(或者如果可能的话)
我能够解决问题。
问题是,SharePoint 需要身份验证,而 pre-flight 中没有提供。所以 pre-flight 得到 401 Unauthorized
并且整个请求失败。
于是又看了一遍Mozilla的文章...
https://developer.mozilla.org/de/docs/Web/HTTP/CORS
... 并看到 pre-flight 没有在 simple requests
上完成(有关 simple requests
的详细信息,请参阅上面的 link)。
所以我这样更改了代码:
fetch('https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test', {
method: 'GET',
mode: 'cors',
headers: {
'Content-Type': 'text/plain',
'Accept': 'application/json'
},
credentials: 'include'
})
本例中的"magic"就是'Content-Type': 'text/plain'
。然后请求被处理为 simple request
并且没有 pre-flight 发生。
我在 IIS
中设置的 HTTP 响应 headers 以这种方式工作,正如您在开头 post.