1月 13, 2020 Programming
在開發網站時 (特別是 ReactJS 時),網站主機 (Web Hosting Server) 和應用程式主機 (Application Server) 很多時都不會是同一台主機。如果在沒有設定 proxy 的情況下,在網站使用 Ajax 載入外部資料時便會出現 `Access-Control-Allow-Origin` 例外。

> Access to XMLHttpRequest at 'https://19site.net/files/7d/79/7d790b71-7af2-4b0b-890d-65c513f4077e.jpeg' from origin http://192.168.1.147:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

### 源因

這是因為安全性的因素,瀏覽器預設不允許 JavaScript 任意存取其他伺服器的資源。以免因為 Session 而能夠載入先前登入過的網站,然後把資料經過惡意網站上載到第三方地址,達到偷取個人資料的功能。

![](https://cdn.19site.net/files/ec/9d/ec9d1b24-dc3b-4904-ad49-c82e0ac37941.png 'Chrome 防址載入外部資源')

### 解決方法

解決方法有二 :  
-	修改 Application Server 的應用程式,使回應的檔頭 (Response Header) 加入 `Access-Control-Allow-Origin` 並設定為相應的 IP 地址。
-	關閉 Chrome 的網站安全設定。 (本文提及的方法)

注意 :  
關閉 Chrome 的網站安全設定隻能生效在本機上,如果正式 Production 的話記得到設定好 Server Application 才對啊 !

另外要留意是關閉了網站安全設定代表你的 Chrome 並不是在安全環境下運行著,不要用這個 Session 的 Chrome 來作為日常使用 ! 不然便會有機會被惡意網站偷取個人資料了 !

### 進入正題

實際的操作是在啟動 Chrome 時加入參數 `--disable-web-security`。

在 Window 上,我們可以建立以下 Shortcut :

> "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:/Chrome-dev-session" --disable-web-security

![](https://cdn.19site.net/files/f3/3e/f33e496b-65a6-4513-85b9-b08b90b9664f.png '建立 Shortcut')

然後我們可以使用新建立的連結來啟動 Chrome。

會看到在啟動時會有警告的字句,提醒使用者使用 `--disable-web-security` 會危害穩定及安全性。

![](https://cdn.19site.net/files/d7/13/d7139948-9b9f-46a6-bdd2-2482ffcf22ce.png 'Chrome 的提示')

再次提醒一次,不要用這個 Session 的 Chrome 來作為日常使用 ! 不然便會有機會被惡意網站偷取個人資料了 !

> 參考資料 : https://stackoverflow.com/questions/20035101/why-does-my-javascript-code-get-a-no-access-control-allow-origin-header-is-pr
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)