最近自己构建了一个轻量级的 MVC 框架,现在将该MVC用于生产环境的项目中,目前因为项目中有跨域的请求,所以需要做一些CORS授权,但在实际使用出现了一些问题,目前已解决,故做下记录。

服务器:centos

web server: nginx

程序语言:php

框架:MVC

在 js (jQuery、AngluarJS的$http)跨域请求中,有特定头需要传送时,都会预先发起一个OPTIONS 请求,而 MVC 所有请求入口都是从默认文档 index.php  开始,即 http://www.allmai.net/ 或 http://www.allmai.net/?ctrl=home,当我们使用这种路径做跨域请求时,会返回:405 错误。

经过分析,发现OPTIONS请求并没有被 PHP 所捕获,也就是说nginx并没有将OPTIONS请求转发给 php-fpm 而直接返回了405错误,然后各种百度,各种谷歌也没有找到好的解决办法,都是说的直接在 nginx 配置中做捕获,经过改造,大至如下:

set $allmai 0;

if ($request_method = OPTIONS) {

set $allmai "${allmai}1";

}

if ($http_origin = http://www.allmai.net) {

set $allmai "${allmai}1";

}

if ($allmai = 011) {

add_header Access-Control-Allow-Origin ${http_origin};

add_header Access-Control-Allow-Methods GET, POST, OPTIONS;

add_header Access-Control-Allow-Headers token,content-type;

return 204;

}

这个方法是可以解决问题的,但是并不灵活,如果很少的几个跨域客户端(跨域的web js请求,索性叫客户端)可以通过改nginx.conf 来实现,但有十个,二十个甚至更多的时候该方法就不太灵了。最终还是需要将OPTONS请求转发给PHP脚本来处理才方便是。

再经历几个小时的模索,发现如果 OPTIONS 请求有指定了 php 文件路径,那么OPTIONS就会被PHP捕获并处理,这下让我突然有了灵感,原来OPTIONS请求未指定 php 文件路径,导致nginx 不知道如何处理该请求,我们只需将默认请求转发给指定的 php 文件即可,同样我们要修改nginx.conf 文件,如下:

location / {

root /home/www/web;

index index.html index.htm index.php;

rewrite ^(.*)/$ $1/index.php last;

}

经过上面的重定,所有的请求都会用index.php进入,至此就解决了OPTIONS 的 405 错误。

nginx php 跨域访问权限,nginx + php 实现跨域请求填坑笔记相关推荐

  1. html的页面怎样直接跨域访问,【HTML】iframe跨域访问问题

    概述 本地同一浏览器访问本地HTML文件和访问服务器端HTML文件,本地Iframe没有自适应高度,而服务器端的Ifrane自适应了高度. 1.问题重现: Chrome 版本 41.0.2272.10 ...

  2. vb跨域访问ajax,解决AJAX的跨域访问-两种有效示例

    这篇文章主要为大家详细介绍了解决AJAX的跨域访问-两种有效示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!新的W3C策略实现了HTTP跨域访问,还 ...

  3. 实现跨域访问---同源策略 、常见跨域方法

    实现跨域访问 同源策略 为了保证用户数据安全 防止恶意网站窃取数据 同源策略 三个行为限制: ​ Cookie.LocalStorage.indexDB无法读取 ​ DOM无法获取 ​ AJAX请求不 ...

  4. ie9以下兼容ajax跨域访问,解决ie9以下浏览器ajax请求报error拒绝访问方案 解决ie9以下浏览器ajax请求报400问题方案

    解决方案如下: 1.ie9以下兼容ajax跨域访问   2.ajax请求开始前添加 jQuery.support.cors = true;  允许跨域 3.ie浏览器设置允许通过域访问数据 并且 ur ...

  5. Nginx指定时间段无法访问(Nginx时间段黑名单)

    Nginx指定时间段无法访问 文章目录 Nginx指定时间段无法访问 背景 配置思路 背景 醒狮运维组部分域名指定时间不对外访问,但是网络管理员休假了,无法从防火墙等一系列位置配置,强制指定要配置Ng ...

  6. 公网访问阿里云数据库MongoDB——填坑笔记

    业务情景 两台服务器,一台阿里云ECS云服务器(专用网络),另一台是阿里云数据库MongoDB,处于安全考虑MongoDB是不运行外网连接的,那接下来就看怎么实现公网访问. 看到上面红色的网络类型描述 ...

  7. 第一百一十期:详解SpringBoot应用跨域访问解决方案

    说到跨域访问,必须先解释一个名词:同源策略.所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同.Host(ip)相同.端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问 ...

  8. apache ajax 跨域访问,AJAX跨域访问(从Tomcat8到Apache/Nginx)

    1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 crossdomain.x ...

  9. nginx实现跨域访问(案例cookie实现跨域,)多方案实现

    案例cookie实现跨域 (我的博客里有更新) 跨域,顾名思义,个人理解就是:任意两个url只要协议.域名.端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题. 方案一(前端需要实现跨域) ...

最新文章

  1. Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(andro
  2. 17Mediator(中介者)模式
  3. 100天后 - 100-days-later
  4. Tungsten Fabric SDN — DCI
  5. 解决faster-rcnn中训练时assert(boxes[:,2]=boxes[:,0]).all()的问题
  6. vba 提取 json某个值_Excel中提取不重复值的方法汇总(5种基础+VBA+1个自定义函数)...
  7. Excel 宏代码实现按相同值分组设置背景颜色
  8. linux 账号管理与ACL权限设定
  9. Wait Event Disk file operations I/O
  10. JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
  11. matlab中svm testacc参数,使用Matlab进行交叉验证的多类SVM的完整示例
  12. 环境变量查看修改工具 RapidEE(Rapid Environment Editor)
  13. 使用UltraISO制作LINUX安装U盘(未成功)
  14. 中英文国家名及手机号码前缀
  15. 5G协议下载地址及介绍
  16. java数据库同步_Java数据同步
  17. unity 敌人朝向主角
  18. 千人基因组(1000 Genomes)提取群体(population)或者样本(sample ID)信息
  19. 后台管理系统 权限管理
  20. 电力电子应用技术的matlab仿真

热门文章

  1. java 邮件模板_Spring Boot 2发送邮件手把手图文教程
  2. 【转】Path.Combine (合并两个路径字符串)方法的一些使用细节
  3. 【转】Microsoft Cloud全新认证体系介绍
  4. 【转】LCS和LCS服务器应用程序概述
  5. java syncr_JAVA基础—Synchronized线程同步机制
  6. python supervisor flask_supervisor配合uwsgi部署flask应用
  7. Hexo 博客自定义一个不使用主题模板渲染的独立页面
  8. mysql emma_ubuntu mysql emma中文乱码问题解决
  9. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐的组合数+(取模,数学,思维)
  10. 【POJ - 3273 】Monthly Expense (二分,最小最大值)