Nginx默認是禁止跨域操作,可能說到跨域好多夥伴會有點迷糊,什麼叫跨域?爲什麼不能跨域呢? 看下面小編的詳解。
url | 說明 | 是否跨域 |
http://www.cnblogs.com/a.js http://www.a.com/b.js | 不同域名 | 是 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 同一域名下不同文件夾 | 否 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 同一域名,不同端口 | 是 |
http://www.a.com/a.js https://www.a.com/b.js | 同一域名,不同協議 | 是 |
http://www.a.com/a.js http://70.32.92.74/b.js | 域名和域名對應ip | 是 |
http://www.a.com/a.js http://script.a.com/b.js | 主域相同,子域不同 | 是(cookie不可訪問) |
http://www.a.com/a.js http://a.com/b.js | 同一域名,不同二級域名(同上) | 是 |
禁止跨域的原因是這樣可以更安全,據小編了解假如瀏覽器記錄了a.com的網站上的cookie,拿到了b.com的網站的進行了驗證這樣就存在了安全風險。小編這塊對安全的需求不是瞭解特別透徹有必要加強。
解決方案:
因爲nginx默認是禁止跨域訪問的,所有當跨域請求數據的時候拿不到相應的數據,特別是字體。
生產環境介紹:
訪問www.a.com的時候,需要調用www.b.com下的css、js、image、字體等,因爲設計到跨域,所以nginx拒絕了我的字體的請求,所以在www.b.com下面的server中加了一個location即可。
# 由於字體使用跨域的方式進行的調用,默認瀏覽器拒絕訪問,加上這個location就可以在其他域名下訪問這個域名的字體了 location ~* \.(eot|ttf|woff|svg|otf|woff2)$ { add_header Access-Control-Allow-Origin *; }
生產環境遇到的問題用上述方法解決了,下面說說如何允許跨域:
在需要允許跨域的server中下面加上下面三句代碼即可:
# 該字段是必須的。它的值要麼是請求時Origin字段的值,要麼是一個*,表示接受任意域名的請求。 add_header 'Access-Control-Allow-Origin' '*'; # 該字段可選。它的值是一個布爾值,表示是否允許發送Cookie。 # 默認情況下,Cookie不包括在CORS請求之中。設爲true,即表示服務器明確許可, # Cookie可以包含在請求中,一起發給服務器。這個值也只能設爲true, # 如果服務器不要瀏覽器發送Cookie,刪除該字段即可 add_header 'Access-Control-Allow-Credentials' 'true'; # 該字段是必須的,用來列出瀏覽器的CORS請求會用到哪些HTTP方法,上例是PUT。 add_header 'Access-Control-Allow-Methods' '*';
參考文檔:http://www.ruanyifeng.com/blog/2016/04/cors.html