2016-12-09 53 views
8

隨着谷歌Chrome或Firefox,如果我嘗試加載以下HTML:<script crossorigin ='anonymous'>,爲什麼腳本「被CORS策略阻止」?

<script crossorigin='anonymous' src='https://stackoverflow.com/foo.js'></script> 

我得到一個CORS錯誤是這樣的:

在訪問腳本 'https://stackoverflow.com/foo.js' 從原點 'https://stackoverflow.com'已被CORS策略阻止:請求的資源上沒有「Access-Control-Allow-Origin」頭...

但是,沒有crossorigin='anonymous'屬性工作正常(當然會產生一個404錯誤,因爲foo.js不存在)。

這是令人驚訝的,因爲anonymous只是supposed to prevent sending any credentials,腳本標籤are not supposed to require CORS。是什麼導致了這種情況,我應該怎麼做?

回答

9

我困惑了一會兒。以下是我現在明白了吧:

According to the W3C,實際上是對crossorigin屬性可能值:anonymoususe-credentials和「缺失值默認」,只能通過省略屬性進行訪問。 (空字符串,在另一方面,映射到anonymous。)缺省值使得瀏覽器跳過CORS完全,這是正常的行爲我期待。如果我們關心的裝載收到錯誤信息的腳本

crossorigin屬性,才應使用。由於訪問此信息需要CORS檢查,因此該資源上必須存在Access-Control-Allow-Origin標題以供加載。

+0

我會離開這個不被接受的,以防有人想寫出更好的解釋了一會兒! – pdg137

+0

pdg137你只需要讓你的服務器在JS文件上返回這個響應標題: 訪問控制允許來源:* – Jerem

+0

是的,這會有所幫助,但我經常不能或不想這樣做。具體來說,加載第三方腳本時。 – pdg137

1

crossorigin屬性只有兩個可能的值:anonymoususe-credentials。比anonymous,包括空值以外的任何值,將被轉換爲anonymous

所以這三個標籤具有相同的含義:

<script src="https://stackoverflow.com/foo.js" crossorigin="anonymous"> 
<script src="https://stackoverflow.com/foo.js" crossorigin=""> 
<script src="https://stackoverflow.com/foo.js" crossorigin="IamCrazy"> 

有趣的是,雖然,是,如果你跳過crossorigin屬性CORS行爲是完全禁用。例如:

<script src="https://stackoverflow.com/foo.js"> 

此標記將在沒有任何CORS相關檢查的情況下運行腳本。在實踐中,沒有crossorigin屬性使得瀏覽器跳過Origin HTTP頭完全。

沒有,如果你的crossoriginanonymoususe-credentials,要求的Origin仍然必須匹配響應的Access-Control-Allow-Origin問題。否則沒有運氣 - 腳本永遠不會被解僱。

來源:HTTP access control (CORS) on Mozilla Developer Network

+1

這是錯誤的。或者它是正確的,但Chrome的實現與此不符。 –

相關問題