Node.js 的 CORS 的高度可配置、中間件相容的實作。
Access-Control-Request-Headers
標頭的解決方法。OPTIONS
請求,請選取endPreflightRequests
選項。(err, matches)
而不是(matches)
。 有關工作範例,請參閱example/express/
。
var express, corser, app;
express = require("express");
corser = require("corser");
app = express();
app.use(corser.create());
app.get("/", function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
有關工作範例,請參閱example/connect/
。
var connect, corser, app;
connect = require("connect");
corser = require("corser");
app = connect();
app.use(corser.create());
app.use(function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
http
使用 Corser var http, corser, corserRequestListener;
http = require("http");
corser = require("corser");
// Create Corser request listener.
corserRequestListener = corser.create();
http.createServer(function (req, res) {
// Route req and res through the request listener.
corserRequestListener(req, res, function () {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
}).listen(1337);
建立一個 Corser 請求偵聽器來產生適當的回應標頭以啟用 CORS 非常簡單:
corser.create()
這相當於設定Access-Control-Allow-Origin: *
的回應標頭。如果您想要限制來源,或允許更複雜的請求或回應標頭,則必須將設定物件傳遞給corser.create
。
Corser 將自動為您結束預檢請求。預檢請求是瀏覽器在特定條件下發送的特殊OPTIONS
請求,用於與伺服器協商 CORS 請求允許使用哪些方法、請求標頭和回應標頭。如果您需要將OPTIONS
方法用於其他內容,只需將endPreflightRequests
設定為false
並自行終止這些請求:
var corserRequestListener;
corserRequestListener = corser.create({
endPreflightRequests: false
});
corserRequestListener(req, res, function () {
if (req.method === "OPTIONS") {
// End CORS preflight request.
res.writeHead(204);
res.end();
} else {
// Implement other HTTP methods.
}
});
具有下列屬性的配置物件可以傳遞給corser.create
。
origins
區分大小寫的來源白名單。如果請求來自不在此清單中的來源,則 CORS 將不會處理該請求。若要接受所有來源( Access-Control-Allow-Origin: *
行為),請省略該屬性或將其設為空數組 ( []
)。
為了允許動態原點檢查,可以傳遞函數(origin, callback)
而不是陣列。 origin
是 Origin 標頭, callback
是一個函數(err, matches)
,其中matches
是一個布林標誌,指示給定的 Origin 標頭是否匹配。
預設:接受所有來源。
methods
大寫的方法白名單。如果請求使用的方法不在此清單中,則 CORS 不會處理該請求。
此處設定值將覆蓋預設簡單方法清單。為了不遺失它們,請使用corser.simpleMethods
連接要新增的方法: corser.simpleMethods.concat(["PUT", "DELETE"])
。
預設值:簡單方法( GET
、 HEAD
、 POST
)。
requestHeaders
不區分大小寫的請求標頭白名單。如果請求使用的請求標頭不在此清單中,則 CORS 不會處理該請求。
此處設定值將覆蓋預設的簡單請求標頭清單。為了不遺失它們,請使用corser.simpleRequestHeaders
連接要新增的請求標頭: corser.simpleRequestHeaders.concat(["Authorization"])
。
預設值:簡單請求標頭( Accept
、 Accept-Language
、 Content-Language
、 Content-Type
、 Last-Event-ID
)。
responseHeaders
不區分大小寫的回應標頭白名單。任何不在此清單中的回應標頭都會被使用者代理程式(瀏覽器)過濾掉。
此處設定值將覆蓋預設簡單回應標頭清單。為了不遺失它們,請使用corser.simpleResponseHeaders
連接要新增的回應標頭: corser.simpleResponseHeaders.concat(["ETag"])
。
預設值:簡單回應標頭( Cache-Control
、 Content-Language
、 Content-Type
、 Expires
、 Last-Modified
、 Pragma
)。
supportsCredentials
一個布林值,指示 cookie 憑證是否可以作為 CORS 請求的一部分傳輸。目前,只有少數 HTML5 元素可以從此設定中受益。
預設值: false
。
maxAge
一個整數,指示預檢請求在客戶端預檢結果快取中保留的最長時間(以秒為單位)。
預設值:未設定。
endPreflightRequests
一個布林值,指示 CORS 預檢請求是否應自動關閉。
預設值: true
。
Origin X is not allowed by Access-Control-Allow-Origin
檢查請求的Origin
標頭是否與配置物件的origins
屬性中提供的來源之一相符。如果您未設定任何origins
屬性,請跳至下一個問題。
如果這沒有幫助,您的要求可能會使用非簡單方法或一個或多個非簡單標頭(請參閱下一個問題)。根據規範,簡單方法集是GET
、 HEAD
和POST
,簡單請求頭集是Accept
、 Accept-Language
、 Content-Language
、 Content-Type
和Last-Event-ID
。如果您的要求使用任何其他方法或標頭,則必須在配置物件的methods
或requestHeaders
屬性中明確列出它們。
您希望允許使用X-Requested-With
標頭的請求。將以下配置物件傳遞給corser.create
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["X-Requested-With"])
});
Request header field Content-Type is not allowed by Access-Control-Allow-Headers
預設配置僅在客戶端發送「簡單」請求時才起作用,即GET
、 HEAD
、 POST
作為方法,以及一些標頭,例如Accept
、 Accept-Language
、 Content-Language
和Content-Type
等Content-Type
的限制:只允許application/x-www-form-urlencoded
、 multipart/form-data
和text/plain
。
通常,API 的Content-Type
為application/json
,預設不允許這樣做。 Content-Type
需要在requestHeaders
鍵下的配置物件中明確指定:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["Content-Type"])
});
Refused to get unsafe header "X"
您的瀏覽器會阻止預檢請求中未明確允許的所有非簡單回應標頭。一組簡單的回應標頭是Cache-Control
、 Content-Language
、 Content-Type
、 Expires
、 Last-Modified
、 Pragma
。如果要存取任何其他回應標頭,則必須在配置物件的responseHeaders
屬性中明確列出它們。
您希望允許客戶端讀取回應的ETag
標頭。將以下配置物件傳遞給corser.create
:
corser.create({
responseHeaders: corser.simpleResponseHeaders.concat(["ETag"])
});