摘要:場景我們的資源來自網絡的四面八方,所以難免需要用上跨域,業界也有非常多跨域的解決方案,這次我是來說說跨域與狀態碼之間的一個問題。
場景
我們的資源來自網絡的四面八方,所以難免需要用上跨域,業界也有非常多跨域的解決方案,這次我是來說說跨域與狀態碼之間的一個問題。
問題當我們的 URL 地址返回的狀態碼是 400、403、404、500 的時候,跨域的資源是不會跟隨返回的,也就是說,即便是 Nginx 上配置了 add_header 關鍵字,也不會隨著內容返回而返回。
舉個例子說:
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *;
當我們在請求對應地址的時候,理應是會返回已經配置好的頭部信息,但是我們來看看最終的結果。
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
內容無誤。
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狀態碼下面居然自定義的響應頭消失了。
原因與解決方式留意 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 只會追加到以上響應狀態碼的響應頭上面。
因為咱們的 API 有各種的狀態碼返回,那么其他狀態碼下,該怎么辦? 大家留意文檔上有一個參數。
Syntax: add_trailer name value [**always**]; Default: — Context: http, server, location, if in location This directive appeared in version 1.13.2.
你會發現有個 [always] 參數,那么這個參數,就是讓你的配置頭,應用在所有的影響上面去。
將參數添加進去:
add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods * always;
重啟 nginx 服務器后重試一下.
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: *
現在 404 也正確了。我們的跨域也正是配置完成。
關于 OPTIONS 請求當我們前端發起跨域請求的時候,會事先發起一次 OPTIONS 請求,以用來查詢該接口是否支持跨域和對應的請求方法。
在配置方面可以這么做。
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; }
當然我這里的 * 這么用是不好的,你需要對應域名去配置。
另外PHP方面我們也提供了一個 CORS 的擴展庫,可以直接在fastd中使用。
github: cors-provider
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39779.html
摘要:最近寫了一些關于前后端分離項目之后,跨域相關方案的基本原理和常見誤區的帖子,主要包括和反向代理。反向代理此時后端相當于不跨域,和正常請求一致,無需額外配置。 最近寫了一些關于前后端分離項目之后,跨域相關方案的基本原理和常見誤區的帖子,主要包括CORS和Nginx反向代理。這兩種方案項目中都有在用,各有優缺,關于具體使用哪種方案,大家的觀點也不大一致,本文主要就此展開一下,從前后端及服務...
摘要:目前,所有瀏覽器都支持該功能,瀏覽器不能低于。因此,實現通信的關鍵是服務器。如果指定的域名在許可范圍內,服務器返回的響應,會多出頭信息字段也可能多出其他可選字段或者是表示接受任意域名的請求。 實際跨域問題及其解決方案 1.課題:ajax實現跨域訪問 2.背景: 1.畫面服務器:192.168.196.6 → tomcat服務2.js模板服務器:192.168.196.8 → ngi...
閱讀 683·2021-11-22 09:34
閱讀 3822·2021-09-22 15:42
閱讀 1327·2021-09-03 10:28
閱讀 1072·2021-08-26 14:13
閱讀 1901·2019-08-29 15:41
閱讀 1423·2019-08-29 14:12
閱讀 3364·2019-08-26 18:36
閱讀 3307·2019-08-26 13:47