1. 程式人生 > >CORS跨域-Nginx使用方法(Access-Control-Allow-Origin錯誤提示)

CORS跨域-Nginx使用方法(Access-Control-Allow-Origin錯誤提示)

問題說明

這裡寫圖片描述
當出現上圖這個的時候,是訪問請求外域URL無法訪問,瀏覽器認為訪問外域URL不安全,導致訪問不了簡稱跨域問題。而這上面出現一句很重要的話“NO Access-Control-Allow-Origin”,這個是什麼?是不是隻要新增“Access-Control-Allow-Origin”頭就能訪問呢?如何新增?會不會有其他問題?

Access-Control-Allow-Origin 表示允許訪問的外域 URI

例子:
Access-Control-Allow-Origin: http://www.a.com
允許訪問www.a.com站點

Access-Control-Allow-Origin: *
“*”允許訪問任何外域URL

這個是由服務端那邊設定的,讓服務端告知瀏覽器允許這個站點訪問。那就是說只要設定了這個引數,那就能跨域了。而這種跨域方式也就叫CORS

CORS是一個W3C標準,全稱是”跨域資源共享”(Cross-origin resource sharing)。
它允許瀏覽器向跨源伺服器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。本文就是談CORS技術實現。

技術介紹

當我們出現跨域提示的時候,其實我們已經向伺服器已經完成一次傳送和接收請求(請求是傳送連線的url)。伺服器接收請求後通知瀏覽器,告訴瀏覽器不能訪問外域站點。瀏覽器會顯示不能訪問原因,顯示訪問外域失敗。

而CORS就是在伺服器上,設定Response Headers 返回引數Access-Control-Allow-Origin,Access-Control-Allow-Headers,Access-Control-Allow-Methods,讓站點能訪問外域。

引數 說明
Control-Allow-Origin 表示允許訪問的外域請求。
Access-Control-Allow-Headers 首部欄位用於預檢請求的響應。其指明瞭實際請求中允許攜帶的首部欄位。
Access-Control-Allow-Methods 首部欄位用於預檢請求的響應。其指明瞭實際請求所允許使用的 HTTP 方法。

如何操作

1.看到下圖我們傳送請求的時候 在Request Headers 中Origin:http://www.a.com,Origin是我們當前站點URL域名。

2.Nginx伺服器接收後會檢視是不是配置CORS,如果是檢視配置的域名是不是匹配如下圖:http://www.a.com,匹配允許這個站點訪問。

3.使用CORS傳送請求,第一個請求會是”OPTIONS”這個是設定返回頭並且返回成功。之後會自動再發一個post/get請求,成功傳送到伺服器。這樣程式碼以及可以成功跨域了。

4.最後在看一下Response Headers 發現Access-Control-Allow-Origin設定http://www.a.com的域名了。代表已經成功設定好CORS了。

相容性

pc相容ie8以上,手機端上隨意用。如果想相容更低版本瀏覽器請使用JSONP或者Nginx做代理。
這裡寫圖片描述

Nginx配置程式碼

在Nginx中的nginx.cof中新增下面程式碼就可以實現CORS跨域了。

set $origin '*';#寫入需要跨域的請求地址
if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' $origin;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain charset=UTF-8';
    add_header 'Content-Length' 0;
    return 204;
}

if ($request_method = 'POST') {
    add_header 'Access-Control-Allow-Origin' $origin;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'GET') {
    add_header 'Access-Control-Allow-Origin' $origin;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

Springboot配置程式碼

@Configuration
public class CorsConfig {
    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        // 設定你要允許的網站域名,如果全允許則設為 *
        config.addAllowedOrigin("http://localhost:4200");
        // 如果要限制 HEADER 或 METHOD 請自行更改
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        // 這個順序很重要哦,為避免麻煩請設定在最前
        bean.setOrder(0);
        return bean;
    }
}

Node express配置程式碼

var app = express();

//設定跨域訪問
app.all('*', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});
app.listen(6064);

相關推薦

CORS-Nginx使用方法Access-Control-Allow-Origin錯誤提示

問題說明 當出現上圖這個的時候,是訪問請求外域URL無法訪問,瀏覽器認為訪問外域URL不安全,導致訪問不了簡稱跨域問題。而這上面出現一句很重要的話“NO Access-Control-Allow-Origin”,這個是什麼?是不是隻要新增“Access-C

Cesium載入傾斜攝影模型,cors的問題No 'Access-Control-Allow-Origin' header is present on the requested resource

    用Cesium載入傾斜攝影模型時,會存在cors跨域的問題,報No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:

Cors請求,配置Access-Control-Allow-Origin:"*",無效解決方案

由於應用需要跨域請求資料,博主在JDK8、Tomcat7.0的cors可以配置Access-Control-Allow-Origin:"*",但是我按照文件配置以後卻沒有生效,一度懷疑是tomcat或者jdk的問題,最後想起來web.xml是按照從前往後的順序載入的。解

Ajax請求No 'Access-Control-Allow-Origin' header is present on the requested resource

背景 安裝完nodejs並使用React傳送Ajax請求時,日誌列印No ‘Access-Control-Allow-Origin’ header is present on the requested resource。 解決方案 之前的部落格中的專案存在SessionFilt

js訪問,No ‘Access-Control-Allow-Origin‘ header is present on

在本地用ajax跨域訪問請求時報錯:   XMLHttpRequest cannot loadhttp://www.zjblogs.com/. No 'Access-Control-Allow-Origin' header is present on the requested r

【html5】在PHP處理js的請求問題:Access-Control-Allow-Origin

在javascript與伺服器的請求中,例如POST。 前提條件:如果你使用了自定義的headers引數content-type,將會被判定為複雜請求。 這時候,在請求資料之前,客戶端會發出一個型別為options的預檢資料。 用來讓伺服器確認此次的請求是否符合安全要求

問題:“No'Access-Control-Allow-Origin'headerispresentontherequestedresource”解決

今天試了一下只用SpringMVC寫介面,然後用本地的 ajax 去訪問介面請求 json 資料,但瀏覽器報了一個“跨域”請求的錯誤,個人理解的跨域問題是,服務端和客戶端的請求不在同一個域名下,但是我這都是在本機上部署的呀,這是什麼問題呢? 原來我理解的“跨域”只是我個人的

ajax請求:No 'Access-Control-Allow-Origin' header is present on the requested resource

ajax跨域請求報錯解決辦法<script type="text/javascript"> $(document).ready(function () { $.ajax({ type : "POST", url : "h

nuxt.js 本地開發問題Access-Control-Allow-Origin及其解決方案

先執行npm i @gauseen/nuxt-proxy -D   再nuxt.config.js的module.exports 裡面新增如下程式碼   modules:[ '@nuxtjs/axios', // 請求代理配置,解決跨域 '

nginx 配置add_header 'Access-Control-Allow-Origin' '*' 依然存在問題

1.問題描述: 前端域名A 在POST請求後端域名為B 的一個介面時候請求成功時不存在跨域問題,請求失敗時瀏覽器提示跨域。 解決: 當請求成功時,HTTP CODE 為200。而請求失敗時HTTP CODE 為400, 此時add_header ‘Access-

OSS設定CORS規則以後還是報No 'Access-Control-Allow-Origin'解決方法

在OSS控制檯設定了CORS規則以後,通過JS程式去呼叫的時候報No 'Access-Control-Allow-Origin' header is present on the requested resource,可以通過下面的思路來進行下排查: 1. 確認檢查C

Nginx配置請求 Access-Control-Allow-Origin *

默認 all 之前 methods 不包含 通知 text options flight 當出現403跨域錯誤的時候 No ‘Access-Control-Allow-Origin‘ header is present on the requested resource,需

No 'Access-Control-Allow-Origin' header is present on the requested 前段vue訪問springboot報錯)

做前端H5的時候。請求另外一個伺服器上的資料。用抓包工具發現已經請求成功,且有資料返回。但是在谷歌F12開啟之後。發現沒有返回;且報錯No 'Access-Control-Allow-Origin' header is present on the requested 。經檢視部落格。發現解決方法

header頭設定解決 “已攔截源請求:同源策略禁止讀取位於 http://47.104.128.87/back/test/test 的遠端資源。原因:CORS 頭缺少 'Access-Control-Allow-Origin'。”

跨域請求錯誤提示如下圖: 解決方法在請求的php頁面新增header頭: 程式碼如下: public function test() { //支援全域名訪問,不安全,部署後需要固定限制為客戶端網址 header('Access-Control-Allow-Origin:*'

Nginx 設定 Access-Control-Allow-Origin 無效的解決辦法

nginx 版本 1.11.3 使用大家說的以下配置,驗證無效,跨域問題仍然存在 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials'

Java 無法問題No 'Access-Control-Allow-Origin'..

轉至:http://www.111cn.net/jsp/Java/119383.htm http://blog.csdn.net/wo541075754/article/details/50696841 1,問題描述 使用 H5 開發了一個本地應用,通過 aja

No 'Access-Control-Allow-Origin' header is present on the requested resource', 訪問的解決方法

1. 當請求不在同一域名下的資原始檔(ip地址+埠號)時,會報如下錯誤: “No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://

Vue專案設定,axios不成功的一個小問題 Vue CLI3請求,Vue proxyTable配置,Access-Control-Allow-Origin

Vue專案,因為前後端分離,所以在請求後端介面時,時常遇到跨站問題, 2、如果前後端部署在同一個域名,就不會有跨域問題,但一般是生產環境部署是同一個域名下,但在開發環境時,並不是同域名呀,所以開發時呼叫介面返回類似“No 'Access-Control-Allow-Or

AJAXAccess-Control-Allow-Origin” JAVA WEB個人解決方法

ajax跨域訪問是一個老問題了,解決方法很多,比較常用的是JSONP方法,JSONP方法是一種非官方方法,存在各種問題,大家可以自行百度。 我們專案使用Spring Web MVC,如果你們沒有用Spring Web MVC也不用擔心,因為方法是通用的。 解決方法:通過設

CORS 頭缺少 'Access-Control-Allow-Origin'(訪問不允許)

用web開發移動應用時遇到了這麼個問題,想要在移動端載入伺服器上的一個php檔案,結果無法載入,瀏覽器顯示 原因是這樣的,這涉及到了一個跨域訪問的問題,比如 你的應用在"www.test1.com"上面,你想從"www.test2.com"上面載入資料,這樣是無法載入的