亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

使用nginx代理,支持微信網(wǎng)頁(yè)授權(quán)不同域名

only_do / 2354人閱讀

摘要:前提了解微信這個(gè)過(guò)程必須要明白感謝超神的圖片從流程我們可以看到,回調(diào)域名其實(shí)就是我們的網(wǎng)頁(yè)授權(quán)域名。

承認(rèn)有點(diǎn)標(biāo)題黨了。這次開(kāi)發(fā)一個(gè)項(xiàng)目遇到問(wèn)題,以前有兩個(gè)微信老項(xiàng)目基于yaf,域名為m.baidu.com(做示例),然后網(wǎng)頁(yè)授權(quán)域名填的是m.baidu.com,而這次新開(kāi)發(fā)的項(xiàng)目是基于laravel,那么域名為wechat.baidu.com,但是網(wǎng)頁(yè)授權(quán)域名怎么辦,這就坑爹了。當(dāng)然了,大部分人不會(huì)遇到這么蛋疼的事情吧。
前提
laravel5.5

php7.1.0

nginx1.10

overtrue/laravel-wechat
了解微信OAuth

這個(gè)過(guò)程必須要明白

感謝超神的圖片

從流程我們可以看到,回調(diào)url域名其實(shí)就是我們的網(wǎng)頁(yè)授權(quán)域名。那么既然這樣我們是不是可以造個(gè)假呢,
在域名為wechat.baidu.com的項(xiàng)目下,我們也把網(wǎng)頁(yè)授權(quán)域名寫成m.baidu.com,然后再使用nginx做代理,基于location 轉(zhuǎn)發(fā)到wechat.baidu.com下;

改寫overtrue/laravel-wechat中間件
為什么要改寫這個(gè)中間件呢,因?yàn)橹虚g件默認(rèn)會(huì)直接獲取你的域名,所以如果我使用wechat.baidu.com,那么默認(rèn)就會(huì)回調(diào)后跳轉(zhuǎn)到wechat.baidu.com,而實(shí)際上我要跳轉(zhuǎn)到m.baidu.com

Middleware文件夾下新建一個(gè)中間件OAuthAuthenticate,并且繼承 OvertrueLaravelWeChatMiddlewareOAuthAuthenticate;:


namespace AppHttpMiddleware;


use IlluminateHttpRequest;
use IlluminateSupportFacadesApp;
use IlluminateSupportFacadesEvent;
use OvertrueLaravelWeChatEventsWeChatUserAuthorized;
use OvertrueLaravelWeChatMiddlewareOAuthAuthenticate as BaseAuthenticate;

class OAuthAuthenticate extends BaseAuthenticate
{
   
   
    public function handle($request, Closure $next, $account = "default", $scopes = null)
    {
        // $account 與 $scopes 寫反的情況
        if (is_array($scopes) || (is_string($account) && str_is("snsapi_*", $account))) {
            list($account, $scopes) = [$scopes, $account];
            $account || $account = "default";
        }

        $isNewSession = false;
        $sessionKey = sprintf("wechat.oauth_user.%s", $account);
        $config = config(sprintf("wechat.official_account.%s", $account), []);
        $officialAccount = app(sprintf("wechat.official_account.%s", $account));
        $scopes = $scopes ?: array_get($config, "oauth.scopes", ["snsapi_base"]);

        if (is_string($scopes)) {
            $scopes = array_map("trim", explode(",", $scopes));
        }

        $session = session($sessionKey, []);

        if (!$session) {
            if ($request->has("code")) {
                session([$sessionKey => $officialAccount->oauth->user() ?? []]);
                $isNewSession = true;

                Event::fire(new WeChatUserAuthorized(session($sessionKey), $isNewSession, $account));

                return redirect()->to($this->getTargetUrl($request));
            }

            session()->forget($sessionKey);




            //本地和測(cè)試環(huán)境下使用這個(gè)
            if(App::environment()=="local" ||App::environment()=="test"){
                return $officialAccount->oauth->scopes($scopes)->redirect($request->fullUrl());
            }


            $query = $request->getQueryString();

            $question = $request->getBaseUrl().$request->getPathInfo() == "/" ? "/?" : "?";

            $url= $query ? $request->getPathInfo().$question.$query : $request->getPathInfo();

            $url="http://m.baidu.com".$url; //就這一步很重要
            
            return $officialAccount->oauth->scopes($scopes)->redirect($url);
        }

        Event::fire(new WeChatUserAuthorized(session($sessionKey), $isNewSession, $account));

        return $next($request);
    }

   
}

然后在kernel.php中的$routeMiddleware添加

"wechat.oauth.baidu.com"=>OAuthAuthenticate::class

然后就可以在路由文件使用了,完工。

nginx 設(shè)置代理
這個(gè)覺(jué)得沒(méi)有什么好講的,其實(shí)原理很簡(jiǎn)單,直接上代碼
     //在m.baidu.com域名配置下,設(shè)置location規(guī)則,所有router以/official_account開(kāi)頭的都去wechat.baidu.com下,然后設(shè)置跨域
     
     location /official_account/{
        add_header "Access-Control-Allow-Origin" "$http_origin";
        add_header "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS";
        add_header "Access-Control-Allow-Headers" "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-CSRF-TOKEN,X-XSRF-TOKEN";
        add_header "Access-Control-Allow-Credentials" "true";
        if ($request_method = "OPTIONS") {
                add_header "Access-Control-Allow-Origin" "$http_origin";
                add_header "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS";
                add_header "Access-Control-Allow-Headers" "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-CSRF-TOKEN,X-XSRF-TOKEN";
                add_header "Access-Control-Allow-Credentials" "true";
                #add_header "Access-Control-Max-Age" 1728000; # 20 天
                #add_header "Content-Type" "text/html charset=UTF-8";
                #add_header "Content-Length" 0;
                return 200;
        }
    # 這下面是要被代理的后端服務(wù)器,它們就不需要修改代碼來(lái)支持跨域了
        proxy_pass http://wechat.m.liaorusanshe.com;
        #       proxy_set_header Host $host;  
        proxy_redirect off;
        #proxy_set_header X-Real-IP $remote_addr; 
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 60;


    }

這個(gè)代碼配置參考了《Nginx配置實(shí)現(xiàn)CORS》,但是直接復(fù)制過(guò)來(lái),配合proxy_pass會(huì)出現(xiàn)400 request header or cookie too large錯(cuò)誤, 百度了一下"400 Bad Request Request Header Or Cookie Too Large",<>可以解決,就是如下三個(gè)設(shè)置有問(wèn)題,去掉就好了:

         proxy_set_header Host $host;  
         proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

綜合分析,應(yīng)該是nginx在使用proxy_pass做跳轉(zhuǎn)時(shí),如果直接使用域名,且需要向后端提交當(dāng)前訪問(wèn)的IP地址時(shí),引發(fā)nginxbug造成死循環(huán),不知道大家有沒(méi)有遇到過(guò)這種情況。

然后重新啟動(dòng)就好了,完工。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/39975.html

相關(guān)文章

  • 移動(dòng)端H5多頁(yè)開(kāi)發(fā)拍門磚經(jīng)驗(yàn)

    摘要:以下會(huì)以其中一個(gè)以公積金頁(yè)面開(kāi)發(fā)項(xiàng)目作為例子,介紹移動(dòng)端的一些常見(jiàn)問(wèn)題和使用作為進(jìn)行多頁(yè)開(kāi)發(fā)的經(jīng)驗(yàn)。所以要想在微信開(kāi)發(fā)調(diào)試工具中獲取,我們需要使用一種叫做內(nèi)網(wǎng)穿透的工具。 showImg(https://segmentfault.com/img/remote/1460000015405042?w=800&h=600);兩年前剛接觸移動(dòng)端開(kāi)發(fā),剛開(kāi)始比較疑惑,每次遇到問(wèn)題都是到社區(qū)里提問(wèn)...

    hightopo 評(píng)論0 收藏0
  • nginx反向代理微信測(cè)試全攻略

    摘要:傳給微信的參數(shù)進(jìn)行轉(zhuǎn)義其中參數(shù)是可以被微信原樣返回,這樣就可以按你自己的需求完成反向代理了??梢匀サ舸罱y(cè)試環(huán)境另一條運(yùn)維的原則是不要在生產(chǎn)環(huán)境上直接改,在測(cè)試環(huán)境修改并經(jīng)過(guò)測(cè)試,測(cè)試通過(guò)后,再上傳到生產(chǎn)環(huán)境。 前言 在與第三方系統(tǒng)進(jìn)行接口開(kāi)發(fā)時(shí),需要不斷的改進(jìn)和測(cè)試,以常見(jiàn)的微信登錄支付和 Alipay 支付和登錄為例. 相對(duì)來(lái)講 Alipay 做起來(lái)容易一些, 一是接口 SDK 封...

    endless_road 評(píng)論0 收藏0
  • 企業(yè)只能申請(qǐng)兩個(gè)微信公眾號(hào),微信開(kāi)發(fā)不夠用?不,一個(gè)公眾號(hào)就夠了!

    摘要:微信年月日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由個(gè)調(diào)整為個(gè)。大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開(kāi)發(fā)時(shí),授權(quán)回調(diào)的域名只能設(shè)置一個(gè),正常的開(kāi)發(fā)一般一套環(huán)境就對(duì)應(yīng)一個(gè)域名。 微信2018年11月16日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由2個(gè)調(diào)整為1個(gè)。企業(yè)類主體注冊(cè)公眾號(hào)數(shù)量上限由5個(gè)調(diào)整為2個(gè)。這個(gè)對(duì)馬上要注冊(cè)公眾號(hào)的企業(yè)來(lái)說(shuō)頓時(shí)心情不好了。 大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開(kāi)發(fā)時(shí),授權(quán)回調(diào)...

    wthee 評(píng)論0 收藏0
  • 前端必須知道的Nginx的常用配置

    摘要:負(fù)載均衡是通過(guò)后端引入一個(gè)負(fù)載均衡器和至少一個(gè)額外的服務(wù)器來(lái)緩解這類問(wèn)題增加的服務(wù)器和原本的服務(wù)器提供相同的內(nèi)容。負(fù)載均衡不需要前端進(jìn)行配置,主要是服務(wù)端進(jìn)行配置,前端稍作了解即可。 Nginx主要功能 負(fù)載均衡 反向代理 動(dòng)靜分離 配置https 負(fù)載均衡 負(fù)載均衡是一門計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),主要用來(lái)優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。如果一個(gè)網(wǎng)站只有一臺(tái)服...

    tracymac7 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<