<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nginx on recca0120 Tech Notes</title><link>https://recca0120.github.io/en/tags/nginx/</link><description>Recent content in Nginx on recca0120 Tech Notes</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 15 Apr 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/en/tags/nginx/index.xml" rel="self" type="application/rss+xml"/><item><title>Laravel Valet Certificate Showing on analytics.google.com? Root Cause and Fix</title><link>https://recca0120.github.io/en/2026/04/15/valet-ca-cert-leak/</link><pubDate>Wed, 15 Apr 2026 12:00:00 +0800</pubDate><guid>https://recca0120.github.io/en/2026/04/15/valet-ca-cert-leak/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post Laravel Valet Certificate Showing on analytics.google.com? Root Cause and Fix" /&gt;&lt;p&gt;You open &lt;code&gt;analytics.google.com&lt;/code&gt; in Chrome and click the certificate — and see this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Subject: filament-scu.test
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Issuer: Laravel Valet CA Self Signed CN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s not Google&amp;rsquo;s certificate. That&amp;rsquo;s your local Laravel Valet CA leaking onto an external site.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t a browser bug or a Google problem — it&amp;rsquo;s your local dev environment intercepting traffic it shouldn&amp;rsquo;t.&lt;/p&gt;
&lt;h2 id="how-it-happens"&gt;&lt;a href="#how-it-happens" class="header-anchor"&gt;&lt;/a&gt;How It Happens
&lt;/h2&gt;&lt;p&gt;Valet builds a local dev stack out of three components:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;dnsmasq&lt;/strong&gt;: resolves &lt;code&gt;*.test&lt;/code&gt; domains to &lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nginx&lt;/strong&gt;: listens on &lt;code&gt;127.0.0.1&lt;/code&gt;, routes requests to local sites by &lt;code&gt;server_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valet CA&lt;/strong&gt;: signs HTTPS certificates for each &lt;code&gt;.test&lt;/code&gt; site&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In a correct setup, &lt;code&gt;/etc/resolver/test&lt;/code&gt; scopes only &lt;code&gt;*.test&lt;/code&gt; lookups to dnsmasq; external domains go through the system DNS. The two never cross paths.&lt;/p&gt;
&lt;p&gt;But there are a few failure modes that break this boundary.&lt;/p&gt;
&lt;h3 id="cause-1-overly-broad-dnsmasq-rules"&gt;&lt;a href="#cause-1-overly-broad-dnsmasq-rules" class="header-anchor"&gt;&lt;/a&gt;Cause 1: Overly Broad dnsmasq Rules
&lt;/h3&gt;&lt;p&gt;The correct content of &lt;code&gt;~/.config/valet/dnsmasq.d/tld-test.conf&lt;/code&gt; is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;address=/.test/127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If this entry loses its TLD restriction, or if global dnsmasq config has a catch-all &lt;code&gt;address&lt;/code&gt; rule, dnsmasq starts resolving domains outside &lt;code&gt;.test&lt;/code&gt; to &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="cause-2-nginx-default-server-catches-external-requests"&gt;&lt;a href="#cause-2-nginx-default-server-catches-external-requests" class="header-anchor"&gt;&lt;/a&gt;Cause 2: nginx Default Server Catches External Requests
&lt;/h3&gt;&lt;p&gt;When nginx gets a request whose &lt;code&gt;Host&lt;/code&gt; header doesn&amp;rsquo;t match any known &lt;code&gt;server_name&lt;/code&gt;, it falls through to the &lt;strong&gt;default server block&lt;/strong&gt;. Valet&amp;rsquo;s default block doesn&amp;rsquo;t reject unknown hosts — it falls back to the Valet PHP server. nginx picks up the TLS certificate from whatever vhost was loaded last, which happens to be a &lt;code&gt;.test&lt;/code&gt; Valet cert.&lt;/p&gt;
&lt;h3 id="cause-3-browser-cached-the-wrong-state"&gt;&lt;a href="#cause-3-browser-cached-the-wrong-state" class="header-anchor"&gt;&lt;/a&gt;Cause 3: Browser Cached the Wrong State
&lt;/h3&gt;&lt;p&gt;Chrome caches HSTS policies and TLS sessions. If even one request to an external domain was answered by Valet&amp;rsquo;s nginx before the DNS issue was fixed, Chrome may cache that connection state and keep presenting the stale cert on every subsequent visit.&lt;/p&gt;
&lt;h3 id="why-analyticsgooglecom-gets-hit"&gt;&lt;a href="#why-analyticsgooglecom-gets-hit" class="header-anchor"&gt;&lt;/a&gt;Why analytics.google.com Gets Hit
&lt;/h3&gt;&lt;p&gt;Google Analytics is a &lt;strong&gt;third-party script&lt;/strong&gt; embedded in local pages. Your local &lt;code&gt;.test&lt;/code&gt; site loads it; the browser tries to resolve &lt;code&gt;analytics.google.com&lt;/code&gt;; if dnsmasq is misbehaving at that moment, it returns &lt;code&gt;127.0.0.1&lt;/code&gt;; nginx gets the request, finds no matching server block, and responds with whichever Valet cert it has handy.&lt;/p&gt;
&lt;h2 id="diagnosis"&gt;&lt;a href="#diagnosis" class="header-anchor"&gt;&lt;/a&gt;Diagnosis
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Step 1 — Check if dnsmasq is intercepting external domains&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig analytics.google.com @127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Expected: &lt;code&gt;SERVFAIL&lt;/code&gt; or a real Google IP.&lt;br&gt;
Problem: &lt;code&gt;127.0.0.1&lt;/code&gt; → dnsmasq is leaking. Keep going.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2 — Verify dnsmasq rules are scoped to .test only&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.config/valet/dnsmasq.d/tld-test.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Should only contain:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;address=/.test/127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;listen-address=127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3 — Check /etc/resolver/ for extra files&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /etc/resolver/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Only your TLD name (e.g. &lt;code&gt;test&lt;/code&gt;) should be here. No blank filename, no wildcard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4 — Check nginx default server behavior&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -T 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; grep -A &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;default_server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If the default server doesn&amp;rsquo;t have &lt;code&gt;return 444&lt;/code&gt; or &lt;code&gt;return 400&lt;/code&gt;, unknown hosts fall through to a real vhost.&lt;/p&gt;
&lt;h2 id="fixes"&gt;&lt;a href="#fixes" class="header-anchor"&gt;&lt;/a&gt;Fixes
&lt;/h2&gt;&lt;h3 id="fix-1-clear-browser-hsts-and-socket-cache"&gt;&lt;a href="#fix-1-clear-browser-hsts-and-socket-cache" class="header-anchor"&gt;&lt;/a&gt;Fix 1: Clear Browser HSTS and Socket Cache
&lt;/h3&gt;&lt;p&gt;The most common case — even after the underlying DNS is fixed, stale cache keeps the bad cert appearing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chrome&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;chrome://net-internals/#hsts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Delete domain security policies&amp;rdquo;, type &lt;code&gt;analytics.google.com&lt;/code&gt; → Delete&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;chrome://net-internals/#sockets&lt;/code&gt; → &lt;strong&gt;Flush socket pools&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Safari&lt;/strong&gt;:
Preferences → Privacy → Manage Website Data → search the affected domain → Remove&lt;/p&gt;
&lt;h3 id="fix-2-flush-system-dns-cache"&gt;&lt;a href="#fix-2-flush-system-dns-cache" class="header-anchor"&gt;&lt;/a&gt;Fix 2: Flush System DNS Cache
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dscacheutil -flushcache &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo killall -HUP mDNSResponder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="fix-3-add-an-nginx-default-server-that-rejects-unknown-hosts"&gt;&lt;a href="#fix-3-add-an-nginx-default-server-that-rejects-unknown-hosts" class="header-anchor"&gt;&lt;/a&gt;Fix 3: Add an nginx Default Server That Rejects Unknown Hosts
&lt;/h3&gt;&lt;p&gt;Adding an explicit catch-all that drops connections prevents any accidental bleed-through from reaching a &lt;code&gt;.test&lt;/code&gt; vhost:&lt;/p&gt;
&lt;p&gt;Find the Valet nginx config directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /opt/homebrew/etc/nginx/valet/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add &lt;code&gt;_reject-default.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/dev/null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/dev/null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;444&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;444&lt;/code&gt; is nginx&amp;rsquo;s connection-close-with-no-response code — the client gets nothing back, the request dies silently.&lt;/p&gt;
&lt;p&gt;Apply:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="fix-4-rebuild-valet-ca-trust-if-the-keychain-state-is-broken"&gt;&lt;a href="#fix-4-rebuild-valet-ca-trust-if-the-keychain-state-is-broken" class="header-anchor"&gt;&lt;/a&gt;Fix 4: Rebuild Valet CA Trust (if the Keychain state is broken)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet trust &lt;span class="c1"&gt;# re-add Valet CA to system trust&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or re-issue certs for your sites:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet unsecure --all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;valet secure &amp;lt;site-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="verify-the-fix"&gt;&lt;a href="#verify-the-fix" class="header-anchor"&gt;&lt;/a&gt;Verify the Fix
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Confirm external domains are no longer intercepted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dig analytics.google.com @127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Expected: SERVFAIL or a real IP, not 127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Confirm nginx rejects unknown hosts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -I --resolve analytics.google.com:443:127.0.0.1 https://analytics.google.com 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Expected: connection refused or SSL handshake failure — not a Valet cert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then open Chrome, visit &lt;code&gt;analytics.google.com&lt;/code&gt;, click the certificate icon — issuer should be Google, not Laravel Valet CA.&lt;/p&gt;
&lt;h2 id="prevention"&gt;&lt;a href="#prevention" class="header-anchor"&gt;&lt;/a&gt;Prevention
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t touch dnsmasq global config&lt;/strong&gt; — Valet&amp;rsquo;s dnsmasq rules should only cover your configured TLD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;After &lt;code&gt;valet install&lt;/code&gt; or major upgrades&lt;/strong&gt;, re-verify dnsmasq rules haven&amp;rsquo;t been broadened&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add the nginx default reject block&lt;/strong&gt; once and forget about it — any stray traffic gets dropped at the nginx layer before it can serve the wrong cert&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid embedding external analytics scripts in local &lt;code&gt;.test&lt;/code&gt; pages&lt;/strong&gt; during development — reduces the surface area where dnsmasq leakage can trigger&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;&lt;a href="#references" class="header-anchor"&gt;&lt;/a&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://laravel.com/docs/valet" target="_blank" rel="noopener"
 &gt;Laravel Valet Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://thekelleys.org.uk/dnsmasq/doc.html" target="_blank" rel="noopener"
 &gt;dnsmasq Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="chrome://net-internals/" &gt;Chrome net-internals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return" target="_blank" rel="noopener"
 &gt;nginx return 444&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>