摘要:場景我們的資源來自網(wǎng)絡(luò)的四面八方,所以難免需要用上跨域,業(yè)界也有非常多跨域的解決方案,這次我是來說說跨域與狀態(tài)碼之間的一個(gè)問題。
場景
我們的資源來自網(wǎng)絡(luò)的四面八方,所以難免需要用上跨域,業(yè)界也有非常多跨域的解決方案,這次我是來說說跨域與狀態(tài)碼之間的一個(gè)問題。
問題當(dāng)我們的 URL 地址返回的狀態(tài)碼是 400、403、404、500 的時(shí)候,跨域的資源是不會跟隨返回的,也就是說,即便是 Nginx 上配置了 add_header 關(guān)鍵字,也不會隨著內(nèi)容返回而返回。
舉個(gè)例子說:
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *;
當(dāng)我們在請求對應(yīng)地址的時(shí)候,理應(yīng)是會返回已經(jīng)配置好的頭部信息,但是我們來看看最終的結(jié)果。
200
HTTP/1.1 200 OK Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 08:46:39 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 558 Last-Modified: Tue, 28 Mar 2017 01:13:24 GMT Connection: keep-alive ETag: "58d9b8b4-22e" Access-Control-Allow-Origin: * Access-Control-Allow-Methods: * Accept-Ranges: bytes
內(nèi)容無誤。
404
HTTP/1.1 404 Not Found Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 08:47:18 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 175 Connection: keep-alive
神奇了,這里404狀態(tài)碼下面居然自定義的響應(yīng)頭消失了。
原因與解決方式留意 Nginx 文檔上說的:
Adds the specified field to a response header provided that the response code equals 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), or 308 (1.13.0). The value can contain variables.
意思就是說,add_header 只會追加到以上響應(yīng)狀態(tài)碼的響應(yīng)頭上面。
因?yàn)樵蹅兊?API 有各種的狀態(tài)碼返回,那么其他狀態(tài)碼下,該怎么辦? 大家留意文檔上有一個(gè)參數(shù)。
Syntax: add_trailer name value [**always**]; Default: — Context: http, server, location, if in location This directive appeared in version 1.13.2.
你會發(fā)現(xiàn)有個(gè) [always] 參數(shù),那么這個(gè)參數(shù),就是讓你的配置頭,應(yīng)用在所有的影響上面去。
將參數(shù)添加進(jìn)去:
add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods * always;
重啟 nginx 服務(wù)器后重試一下.
200
HTTP/1.1 200 OK Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 09:01:36 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 558 Last-Modified: Tue, 28 Mar 2017 01:13:24 GMT Connection: keep-alive ETag: "58d9b8b4-22e" Access-Control-Allow-Origin: * Access-Control-Allow-Methods: * Accept-Ranges: bytes
200請求沒變化,一切正常。
404
HTTP/1.1 404 Not Found Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 09:02:12 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 175 Connection: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Methods: *
現(xiàn)在 404 也正確了。我們的跨域也正是配置完成。
關(guān)于 OPTIONS 請求當(dāng)我們前端發(fā)起跨域請求的時(shí)候,會事先發(fā)起一次 OPTIONS 請求,以用來查詢該接口是否支持跨域和對應(yīng)的請求方法。
在配置方面可以這么做。
if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; add_header Access-Control-Allow-Credentials true; return 204; }
當(dāng)然我這里的 * 這么用是不好的,你需要對應(yīng)域名去配置。
另外PHP方面我們也提供了一個(gè) CORS 的擴(kuò)展庫,可以直接在fastd中使用。
github: cors-provider
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/39779.html
摘要:最近寫了一些關(guān)于前后端分離項(xiàng)目之后,跨域相關(guān)方案的基本原理和常見誤區(qū)的帖子,主要包括和反向代理。反向代理此時(shí)后端相當(dāng)于不跨域,和正常請求一致,無需額外配置。 最近寫了一些關(guān)于前后端分離項(xiàng)目之后,跨域相關(guān)方案的基本原理和常見誤區(qū)的帖子,主要包括CORS和Nginx反向代理。這兩種方案項(xiàng)目中都有在用,各有優(yōu)缺,關(guān)于具體使用哪種方案,大家的觀點(diǎn)也不大一致,本文主要就此展開一下,從前后端及服務(wù)...
摘要:目前,所有瀏覽器都支持該功能,瀏覽器不能低于。因此,實(shí)現(xiàn)通信的關(guān)鍵是服務(wù)器。如果指定的域名在許可范圍內(nèi),服務(wù)器返回的響應(yīng),會多出頭信息字段也可能多出其他可選字段或者是表示接受任意域名的請求。 實(shí)際跨域問題及其解決方案 1.課題:ajax實(shí)現(xiàn)跨域訪問 2.背景: 1.畫面服務(wù)器:192.168.196.6 → tomcat服務(wù)2.js模板服務(wù)器:192.168.196.8 → ngi...
閱讀 698·2021-11-22 09:34
閱讀 3831·2021-09-22 15:42
閱讀 1343·2021-09-03 10:28
閱讀 1082·2021-08-26 14:13
閱讀 1912·2019-08-29 15:41
閱讀 1440·2019-08-29 14:12
閱讀 3376·2019-08-26 18:36
閱讀 3320·2019-08-26 13:47