浏览器没有为跨源请求设置源头?

AIo*_*Ion 7 cross-domain same-origin-policy cors

我有一个简单的index.html文件。这个 html 正在加载localhost:3000

<body>
    <h1>Some app</h1>
    <script src="http://localhost:3005/script.js"></script>
</body>
Run Code Online (Sandbox Code Playgroud)

script.js设置从另一个初始装载:localhost:3005

根据我的理解,浏览器应该拦截请求并向其添加原始标头-并向服务器发出预检请求localhost:3005以检查是否localhost:3000允许。

但我没有origin。浏览器似乎没有添加原始标题。这是负责提供script.js文件 ( localhost:3005)的服务器。我正在使用cors 模块

const app = express()

const whitelist = ["http://localhost:3001"]
const corsOptions = {
    origin: function(origin, callback) {
        console.log("origin is: ", origin);      //undefined -- why is undefined??

        if (whitelist.indexOf(origin) !== -1) {
            callback(null, true)
        }
        else {
            callback(new Error('Not allowed by CORS'))
        }
    }
}

app.use(cors(corsOptions), express.static(__dirname))
app.listen(3005, () => {
    console.log("server listening on port 3005")
})
Run Code Online (Sandbox Code Playgroud)

我的实际目标是加入白名单 localhost:3000用于要求我的script.js

localhost:3001只是为了测试我是否真的收到了 cors 错误 - 应该是这样。

但我什至没有得到起源 - 这是什么原因造成的? 我在 Firefox 和 Chrome 中得到相同的行为。我误解了这个洞的过程吗?谢谢 :)

编辑:也许看到请求有帮助

浏览器不附加原始标题

Kev*_*nry 2

我认为您可能误解了 CORS 的目的。它使服务器能够选择接受某些类型的请求,否则浏览器的同源策略将不允许这些请求。它不提供一种机制来禁止以前允许的请求。

src同源策略始终允许在标签中执行来自外国的脚本<script>,因此 CORS 根本不适用。这就是请求中没有标头的原因。

我的实际目标是仅localhost:3000将请求我的script.js.

您不能为此使用 CORS。事实上,你可能根本无法做到这一点。我会退一步问你为什么要这样做。如果您试图保护私有数据,那么可能需要某种身份验证机制(令牌、cookie 等)。