nginx php 跨域访问权限,nginx + php 实现跨域请求填坑笔记
最近自己構(gòu)建了一個(gè)輕量級(jí)的 MVC 框架,現(xiàn)在將該MVC用于生產(chǎn)環(huán)境的項(xiàng)目中,目前因?yàn)轫?xiàng)目中有跨域的請(qǐng)求,所以需要做一些CORS授權(quán),但在實(shí)際使用出現(xiàn)了一些問(wèn)題,目前已解決,故做下記錄。
服務(wù)器:centos
web server: nginx
程序語(yǔ)言:php
框架:MVC
在 js (jQuery、AngluarJS的$http)跨域請(qǐng)求中,有特定頭需要傳送時(shí),都會(huì)預(yù)先發(fā)起一個(gè)OPTIONS 請(qǐng)求,而 MVC 所有請(qǐng)求入口都是從默認(rèn)文檔 index.php ?開始,即 http://www.allmai.net/ 或 http://www.allmai.net/?ctrl=home,當(dāng)我們使用這種路徑做跨域請(qǐng)求時(shí),會(huì)返回:405 錯(cuò)誤。
經(jīng)過(guò)分析,發(fā)現(xiàn)OPTIONS請(qǐng)求并沒(méi)有被 PHP 所捕獲,也就是說(shuō)nginx并沒(méi)有將OPTIONS請(qǐng)求轉(zhuǎn)發(fā)給 php-fpm 而直接返回了405錯(cuò)誤,然后各種百度,各種谷歌也沒(méi)有找到好的解決辦法,都是說(shuō)的直接在 nginx 配置中做捕獲,經(jīng)過(guò)改造,大至如下:
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;
}
這個(gè)方法是可以解決問(wèn)題的,但是并不靈活,如果很少的幾個(gè)跨域客戶端(跨域的web js請(qǐng)求,索性叫客戶端)可以通過(guò)改nginx.conf 來(lái)實(shí)現(xiàn),但有十個(gè),二十個(gè)甚至更多的時(shí)候該方法就不太靈了。最終還是需要將OPTONS請(qǐng)求轉(zhuǎn)發(fā)給PHP腳本來(lái)處理才方便是。
再經(jīng)歷幾個(gè)小時(shí)的模索,發(fā)現(xiàn)如果 OPTIONS 請(qǐng)求有指定了 php 文件路徑,那么OPTIONS就會(huì)被PHP捕獲并處理,這下讓我突然有了靈感,原來(lái)OPTIONS請(qǐng)求未指定 php 文件路徑,導(dǎo)致nginx 不知道如何處理該請(qǐng)求,我們只需將默認(rèn)請(qǐng)求轉(zhuǎn)發(fā)給指定的 php 文件即可,同樣我們要修改nginx.conf 文件,如下:
location / {
root /home/www/web;
index index.html index.htm index.php;
rewrite ^(.*)/$ $1/index.php last;
}
經(jīng)過(guò)上面的重定,所有的請(qǐng)求都會(huì)用index.php進(jìn)入,至此就解決了OPTIONS 的 405 錯(cuò)誤。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的nginx php 跨域访问权限,nginx + php 实现跨域请求填坑笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡核卡日怎么查?多种方法可供查询
- 下一篇: php分页页数过多隐藏,织梦DEDE中内