HTTP Headers 之 Origin
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP Headers 之 Origin相关的知识,希望对你有一定的参考价值。
参考技术AHTTP 协议中的 Origin Header 存在于请求中 , 用于指明当前请求来自于哪个站点 。
Origin 仅仅包含站点信息, 不包含 任何路径信息。
参考: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Origin
当我们的浏览器发出跨站请求时,行为正确的服务器会校验当前请求是不是来自被允许的站点。服务器就是通过 Origin 字段的值来进行的判断。
当服务器的配置出错时,比如配置成了 https://baidu.com/ ,则可能造成一些难以理解的问题。
比如有的浏览器(IE)能够请求成功,而有的浏览器却请求失败(Chrome)。这不是因为前一个浏览器行为正确,而是因为前一个浏览器发出请求时没有带上 Origin 而后一个浏览器带上了正确的 Origin 。而在服务器端,因为没有 Origin Header,所以认为这不是一次 CORS 请求,所以没有进行 CORS 校验。这也反过来要求服务端强制请求带上 Origin Header,才能进一步保证服务器的安全性。
req.headers.origin 始终未定义,如何允许多个域用于 ALLOW-FROM
【中文标题】req.headers.origin 始终未定义,如何允许多个域用于 ALLOW-FROM【英文标题】:req.headers.origin always undefined, how to allow multiple domains for ALLOW-FROM 【发布时间】:2019-01-11 05:28:59 【问题描述】:我想允许 Access-Control-Allow-Origin
(CORS) 和 ALLOW-FROM
(iframe) 用于多个地址。我环顾四周,发现了这个:
Enable Access-Control-Allow-Origin for multiple domains in nodejs
还有其他几个人说要做这样的事情:
const allowedOrigins = ["https://example1.com", "https://example2.com"];
if (allowedOrigins.includes(req.headers.origin))
res.set("Access-Control-Allow-Origin", req.headers.origin);
res.set("X-Frame-Options", `ALLOW-FROM $req.headers.origin`);
问题是req.headers.origin
在开发和生产服务器中总是未定义。当我查看 Web Inspector 的 Network 选项卡时,从来没有一个名为 origin 的请求标头,只有 host 或有时是 referer。
所以我尝试了以下方法:
const origin = `$req.protocol://$req.headers.host`;
res.set("Access-Control-Allow-Origin", origin);
这很好用,但它不能用于 X-Frame-Options
标头,因为 host 是 Web 所在的地址,而不是 iframe 父级的地址。我需要ALLOW-FROM https://example1.com
,而不是ALLOW-FROM https://myapp.com
。你能帮我解决一下吗?
【问题讨论】:
【参考方案1】:我希望,这就是你要找的:
Configuring CORS w/ Dynamic Origin
var express = require('express')
var cors = require('cors')
var app = express()
var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptions =
origin: function (origin, callback)
if (whitelist.indexOf(origin) !== -1)
callback(null, true)
else
callback(new Error('Not allowed by CORS'))
app.get('/products/:id', cors(corsOptions), function (req, res, next)
res.json(msg: 'This is CORS-enabled for a whitelisted domain.')
)
app.listen(80, function ()
console.log('CORS-enabled web server listening on port 80')
)
【讨论】:
您好,我需要为多个域设置 X-Frame-Options,以便它们可以将我的网站嵌入 iframe。cors
是否也设置了此标头?它似乎有不同的目的(CORS 处理)。
感谢您的提示,但这对我有什么帮助?这似乎是一种更复杂的写作方式res.set("X-Frame-Options", "Deny");
以上是关于HTTP Headers 之 Origin的主要内容,如果未能解决你的问题,请参考以下文章
接口测试工具-Jmeter使用笔记(三:管理请求服务器信息和Headers参数)
Python之requests错误Expecting value: line 1 column 1 (char 0)