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 Domainnamenyaf
(als Beispiel). Dann wurde der autorisierte Domainname für die Webseite mit und das neu entwickelte Projekt basiert dieses Mal aufm.baidu.com
, dann lautet der Domainnamem.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.laravel
wechat.baidu.com
Voraussetzung
laravel5.5 php7.1.0 nginx1.10 overtrue/laravel-wechat
Danke für die tollen Bilder
Aus dem Prozess können wir ersehen, dass der Rückruf-
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 nginx
location
Umschreiben der wechat.baidu.com
Middleware
overtrue/laravel-wechat
verwende, wird nach dem Rückruf standardmäßig zu Ordner und erben Siewechat.baidu.com
wechat.baidu.com
springen. Erstellen Sie eine neue Middlewarem.baidu.com
unter
: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
in kernel.php
hinzu und Sie können es dann in der Routing-Datei verwenden, und schon sind Sie fertig. $routeMiddleware
//在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; }
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. nginx
Dann neu starten und fertig. proxy_pass
nginx
Das 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
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!