1. 程式人生 > >ThinkPHP 5.1 跨域配置

ThinkPHP 5.1 跨域配置

因為最近的專案採用了API介面開發方式,後端需要配置跨域的規則以便前端能夠訪問。

系統採用的框架為 ThinkPHP,版本 5.1.19

關於OPTIONS請求

由於前端的知識不是很熟悉,查閱了網上的資料得知,OPTIONS 請求是在 AJAX 傳送請求前傳送的一個驗證請求,該請求會驗證一系列規則,若符合規則則會發送實際的 GET 或 POST 請求,跨域的規則也是 OPTIONS 請求時進行驗證的。

遇到的問題

按照網上大部分關於跨域請求的配置,基本都是以下三行程式碼:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
header('Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,PATCH');

把這三行程式碼放到 /route/route.php,/route/api.php,/public/index.php 以及受訪問的控制器檔案頭部均出現以下報錯資訊:

Failed to load http://url.com/main/info: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'null' is therefore not allowed access.The response had HTTP status code 404.

說明配置並沒有生效。

查閱 ThinkPHP 的文件,文件給出的例子:

Route::get('new/:id', 'News/read')
    ->ext('html')
    ->allowCrossDomain();

意思是隻需要在路由的尾部新增 allowCrossDomain() 即可,所以我在每個需要進行跨域訪問的路由後都添加了 ->allowCrossDomain(),問題得以解決。

另外的問題

由於前端的 AJAX 請求通常需要攜帶 token 驗證,所以還需要將 token 新增到 Access-Control-Allow-Headers

文件的例子是

Route::get('new/:id', 'News/read')
    ->ext('html')
    ->header('Access-Control-Allow-Origin','thinkphp.cn')
    ->header('Access-Control-Allow-Credentials', 'true')
    ->allowCrossDomain();

我按照上面的方法添加了 ->header('Access-Control-Allow-Headers','token') ,再次請求出現了下面的報錯:

Failed to load: http://url.com/main/info: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.

header 的配置沒有生效。

解決辦法:將 header('Access-Control-Allow-Headers: content-type,token'); 新增到 入口檔案 /public/index.php 即可。

相關推薦

ThinkPHP 5.1 配置

因為最近的專案採用了API介面開發方式,後端需要配置跨域的規則以便前端能夠訪問。 系統採用的框架為 ThinkPHP,版本 5.1.19 關於OPTIONS請求 由於前端的知識不是很熟悉,查閱了網上的資料得知,OPTIONS 請求是在 AJAX 傳送請求前傳送的一個驗證

Nginx 配置

res tro 問題 days coo elk max-age user pen 隨著 RESTFul 的流行,就會牽扯到跨域問題,那麽小夥伴有沒有被坑過,高人繞過,有需求的請往下看: location / {  if ($request_method = ‘OPTION

thinkphp中session問題

cto jpg access car ls參數 -c style 使用 應用 問題描述 《thinkphp實現短信驗證註冊》中,小編不止記錄了短信驗證碼的實現方法,同時還記錄了圖片驗證碼的實現方法。本地使用,一切正常;後端項目和前端項目都部署到服務器,一切正常;後端項目部署

webAPI配置

tom method 限制 protocol requested acc bapi access get <httpProtocol> <!--跨域配置開始--> <customHeaders> &

springboot配置

port get example pro har sta 網頁 bean build   關於什麽是跨域的問題,感興趣的同學可以看阮一峰老師的日誌 http://www.ruanyifeng.com/blog/2016/04/cors.html。   下面貼出我在sprin

.Net Core Api 配置

允許 host public ice conf ONBUILD fig edev lec .Net Core 和Asp.Net 不同,不需要再去引用其他的跨域組件。創建項目時,就有了。 讓接口實現跨域,需要配置兩個地方。 一、Startup.cs 這裏需要配置兩個地方

dotnet core 2.1

.NET Core跨域問題: 1、在Startup.cs中ConfigureServices中新增: services.AddCors();   2、在Startup.cs中Configure方法中新增: app.UseCors(builder => builder

windows下apache 配置

1,首先編輯httpd.conf 找到  #LoadModule headers_module modules/mod_headers.so 去掉# 2,修改以下配置 conf/extra/httpd-ssl      &n

Thinkphp 5.1+ 中的路由分組

開篇廢話: 除四書外,杜撰的太多,偏只我是杜撰不成? thinkphp 3.2 之後 '杜撰' Laravel 太嚴重,既然這樣,我 們為什麼不直接用 Laravel 呢?!! 我用 Lumen 寫 api 習慣了,總是想把路由寫成分組格式或是把字首,中介軟體等摘出來,TP5.1+ 中可以實現,

vue-cli3.x vue.config.js 配置

blog 調用 art code 頁面 port tail chang then devServer: { open: true, //瀏覽器自動打開頁面 host: "0.0.0.0", //如果是真機測試,就使用這個IP

ThinkPHP 5.1.x SQL注入漏洞分析

一、背景引見 ThinkPHP 是一個疾速、複雜的基於 MVC 和麵向物件的輕量級 PHP 開發框架,遵照 Apache2 開源協議釋出。ThinkPHP從降生以來不斷秉承簡潔適用的設計準繩,在堅持出色的功能和至簡的程式碼的同時,也注重開發體驗和易用性,為 WEB 使用和 API 開發提供了強無

spring-boot 全域性配置

什麼是跨域問題?       跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器對 JavaScript 施加的安全限制。 什麼是同源? 所謂同源是指,域名,協議,埠均相同 http://www.wzhu.tk

asp.net Core 配置

1.新增中介軟體 在ConfigureServices中新增 //跨域中介軟體服務 services.AddCors();   在 Configure中新增   //跨域配置 app.UseCors(builder =&g

nignx配置處理

在nginx.conf中配置 server { location / { index index.html index.htm index.php l.php; add_header 'Access-Contr

nginx配置(windos走過的坑)

nginx下載地址: http://nginx.org/en/download.html 紅圈區域是穩定版 解壓之後放在資料夾就可以了。 解壓後:  注意:這裡面有個nginx.exe檔案,一般情況下雙擊執行就可以了,但是由於windos部分機型他不支援日誌填寫,執行後可能無法關閉

spring boot 配置

新建如下JAVA類: import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springf

前後端分離 後端配置以及Opitions 方法不被訪問

後端這裡是 .net framework4.6 webapi 在web.config中<system.webServer>節點配置  <httpProtocol>       <customHeaders> &n

centos7.2 環境下 mysql-5.1.73 安裝配置

安裝mysql,安裝前準備 如果mysql使用者不存在,那麼新增mysql使用者 groupadd mysql useradd -g mysql mysql mysql編譯安裝 tar -zxvf mysql-5.1.73.tar.gz cd mysql-5.1.73 yum install nc

vue axois 配置

在vue專案中找到config裡面的index,再配置裡面的proxyTable如下圖: dev: { // Paths解決跨域問題 assetsSubDirectory: ‘static’, assetsPublicPath: ‘/’, proxyTable:

Spring-Boot v2.0.5 設定訪問

在@Configuration註解下的類中新增如下配置 @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfig