Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie den Nginx-Proxy, um WeChat-Webseiten zu unterstützen, die verschiedene Domänennamen autorisieren

Verwenden Sie den Nginx-Proxy, um WeChat-Webseiten zu unterstützen, die verschiedene Domänennamen autorisieren

不言
不言Original
2018-07-07 16:10:563778Durchsuche

Dieser Artikel stellt hauptsächlich die Verwendung von Nginx-Proxy zur Unterstützung verschiedener Domänennamen vor. Jetzt kann ich ihn mit allen teilen, die ihn benötigen

Geben Sie zu, dass es eine Art Schlagzeile ist. Bei der Entwicklung eines Projekts ist dieses Mal ein Problem aufgetreten. Es gab zwei alte WeChat-Projekte mit dem Domainnamen yaf (als Beispiel). Dann wurde der autorisierte Domainname für die Webseite mit und das neu entwickelte Projekt basiert dieses Mal auf m.baidu.com, dann lautet der Domainname m.baidu.com, aber was ist, wenn die Webseite den Domainnamen autorisiert? Dies ist ein Betrug. Natürlich werden die meisten Menschen nicht auf so etwas Schmerzhaftes stoßen. laravelwechat.baidu.comVoraussetzung
laravel5.5

php7.1.0

nginx1.10

overtrue/laravel-wechat

WeChat OAuth verstehen

Dieser Prozess muss verstanden werden


Verwenden Sie den Nginx-Proxy, um WeChat-Webseiten zu unterstützen, die verschiedene Domänennamen autorisierenDanke für die tollen Bilder


Verwenden Sie den Nginx-Proxy, um WeChat-Webseiten zu unterstützen, die verschiedene Domänennamen autorisierenAus dem Prozess können wir ersehen, dass der Rückruf-

-Domänenname tatsächlich der autorisierte Domänenname unserer Webseite ist. Können wir in diesem Fall eine Fälschung erstellen?

Unter dem Projekt mit dem Domainnamen url schreiben wir auch den autorisierten Domainnamen der Webseite als
und verwenden dann wechat.baidu.com als Agent und weiterleiten basierend auf m.baidu.com Gehe zu nginxlocation Umschreiben der wechat.baidu.com Middleware

Warum sollte ich diese Middleware automatisch umschreiben? Wenn ich also overtrue/laravel-wechat verwende, wird nach dem Rückruf standardmäßig zu

gesprungen, aber eigentlich möchte ich zu
wechat.baidu.comwechat.baidu.com springen. Erstellen Sie eine neue Middleware m.baidu.com unter
Ordner und erben Sie

:Middleware

namespace App\Http\Middleware;


use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Overtrue\LaravelWeChat\Events\WeChatUserAuthorized;
use Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate 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);




            //本地和测试环境下使用这个
            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);
    }

   
}
OAuthAuthenticate. Fügen Sie dann OvertrueLaravelWeChatMiddlewareOAuthAuthenticate;
"wechat.oauth.baidu.com"=>OAuthAuthenticate::class
zu

in kernel.php hinzu und Sie können es dann in der Routing-Datei verwenden, und schon sind Sie fertig. $routeMiddleware

Nginx-Einstellungs-Proxy

Ich glaube nicht, dass es dazu viel zu sagen gibt. Tatsächlich ist das Prinzip sehr einfach, gehen Sie einfach zum Code

     //在m.baidu.com域名配置下,设置location规则,所有router以/official_account开头的都去wechat.baidu.com下,然后设置跨域
     
     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;
        }
    # 这下面是要被代理的后端服务器,它们就不需要修改代码来支持跨域了
        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;


    }

Das Code-Konfiguration bezieht sich auf „Nginx-Konfiguration zum Implementieren von CORS“. Wenn Sie ihn jedoch direkt kopieren und mit
verwenden, wird nach der Suche auf Baidu,
, > kann wie folgt gelöst werden: Es liegt ein Problem mit dieser Einstellung vor, entfernen Sie es einfach:

         proxy_set_header Host $host;  
         proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass Umfassende Analyse, es sollte 400 request header or cookie too large Bei Verwendung von Um einen Sprung zu machen, müssen Sie bei direkter Verwendung des Domainnamens die aktuell aufgerufene IP an die Backend-Adresse senden. Das "400 Bad Request  Request Header Or Cookie Too Large", das auslöst, verursacht eine Endlosschleife. Ich weiß nicht, ob jemand darauf gestoßen ist diese Situation.

nginxDann neu starten und fertig. proxy_passnginxDas Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website. bug

Verwandte Empfehlungen:

Nginx-Portzuordnungskonfiguration

Statische Seite für die Nginx-Bereitstellung

Das obige ist der detaillierte Inhalt vonVerwenden Sie den Nginx-Proxy, um WeChat-Webseiten zu unterstützen, die verschiedene Domänennamen autorisieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn