Nic*_*mer 24 redirect http cors preflight
我正在设计一个API,允许用户进行身份验证(使用令牌)并在同一域中包含重定向.现在,对于返回303的端点的未经身份验证的请求,
GET /documents/123 --> 303 redirect to `/documents/abc`
GET /documents/abc --> 200
Run Code Online (Sandbox Code Playgroud)
一切顺利.
让我们对Authorization发送标头的同一端点进行经过身份验证的请求.这使得请求成为预先请求,并且浏览器执行预检OPTIONS请求,即
OPTIONS /documents/123 --> 204 (everything okay, please proceed)
GET /documents/123 --> 303 redirect to `/documents/abc`
Run Code Online (Sandbox Code Playgroud)
此时,浏览器产生的不是GET实际资源/documents/abc
XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe.
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie',
which is disallowed for cross-origin requests that require preflight.
Run Code Online (Sandbox Code Playgroud)
此行为符合标准:
7.1.5带预检的跨源请求
如果响应的HTTP状态代码不在2xx范围内
应用网络错误步骤.
这似乎意味着即使重定向位于同一个域(),也无法对经过身份验证的资源进行重定向localhost.
这真的可以吗?有一个共同的解决方法吗?
bis*_*hop 16
在成功进行CORS预检后,原始标准确实排除了重定向.引用§7.1.5.3:
这是实际的要求.在发出请求时,应用make a request步骤并遵守下面的请求规则.
- 如果响应的HTTP状态代码为301,302,303,307或308,则应用缓存和网络错误步骤.
由于您的努力(谢谢!),8月4日更新标准以允许在成功进行CORS预检检查后重定向.
在浏览器迎头赶上之前,唯一可行的选择似乎是一个或组合:
Location标题中有您自己的URL 作为"代理".准备好有限的浏览器支持,因为不推荐使用305.meta refresh和/或Javascript Location更改返回HTML .iframe将重定向目标作为iframe的源.