<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>免费、Serverless的EdgeOne，根域名跳转与域名邮箱如何兼容 · Karl Coding</title><description>EdgeOne如何让根域名的跳转与域名邮箱兼容</description><link>https://www.leekarl.com/</link><language>zh-CN</language><item><title>免费、Serverless的EdgeOne，根域名跳转与域名邮箱如何兼容</title><link>https://www.leekarl.com/blog/edgeone-apex-flattening/</link><guid isPermaLink="true">https://www.leekarl.com/blog/edgeone-apex-flattening/</guid><description>EdgeOne如何让根域名的跳转与域名邮箱兼容</description><pubDate>Fri, 13 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本博客在开始之初，就打算采取Serverless架构，避免因我自己的问题导致网站无法访问。&lt;/p&gt;
&lt;p&gt;而随着AI时代的到临，CVE漏洞越来越多，这么做的必要性就越来越大。而在前几日随着PHP漏洞的爆发，迫使我必须关闭之前Typecho博客暂避风头，之前旧的文章在AI时代已然失去了价值。我也借着这个机会，将个人主页和博客重新修缮，也是一种新的开始。&lt;/p&gt;
&lt;p&gt;而我几乎很快地选定了本博客通过Github Pages进行部署，这种部署方式完全免费，而通过Action更新网站也完全不会让我担心任何的高危漏洞。&lt;/p&gt;
&lt;p&gt;在我改完代码并部署后，发现Github Pages依旧面临中国大陆方向的访问问题。在心中不免一声哀叹，正准备完全不考虑中国大陆方向的访问时，突然想到中国大陆内的一些厂商也有一些免费产品。&lt;/p&gt;
&lt;p&gt;本着不用白不用的心态，我还是继续用了腾讯云的EdgeOne Makers产品。这个产品几乎是完全对标Pages，让我无需在意那么多后续维护事宜。&lt;/p&gt;
&lt;p&gt;而在EdgeOne Makers的使用过程中，其@解析需要跳转到www的问题就出现了。这个问题一直是我的“Pain in the butt”。&lt;/p&gt;
&lt;p&gt;在@解析跳转到www时，我不得不考虑两个非常让人头疼的问题。一个是301跳转也必须要带上SSL证书，体验才能够完美。其二是@解析记录如果用CNAME则会干扰域名邮箱。而恰好EdgeOne就不支持A解析记录接入。&lt;/p&gt;
&lt;p&gt;本文章即为我尝试通过自制CNAME展平的方式，绕过此限制。&lt;/p&gt;
&lt;h2 id=&quot;根域名的问题&quot;&gt;根域名的问题&lt;/h2&gt;
&lt;p&gt;www可以直接设置CNAME，而根域名则不行。我的根域名上有域名邮箱的MX记录，以及SPF等TXT记录，而DNS规范并不允许CNAME与其他记录共存。即便强行添加，DNS服务商要么直接拒绝，要么允许添加但邮件收发会变得不稳定。&lt;/p&gt;
&lt;p&gt;我对这件事的要求是：DNS继续托管在DNSPod，邮箱的记录不做改动，根域名同样经过中国大陆的CDN节点并有SSL证书，同时不额外花钱，部署完成后也不需要我再手动维护。&lt;/p&gt;
&lt;p&gt;市面上现成的方案我大致都看过一遍。DNSPod本身就有CNAME展平功能，可以直接解决这个问题，但仅企业版及以上提供，一年需要两千多元。EdgeOne采用NS接入时可以处理根域名，但需要将NS从DNSPod迁出并另购套餐，并且官方文档对于根域名CNAME与MX共存的描述也只是“允许配置，但可能冲突”。Cloudflare虽然免费提供展平，但展平时不会携带访客的地区信息，中国大陆的用户拿到的会是EdgeOne的海外节点，也就失去了意义。至于DNSPod的URL转发，则不支持HTTPS。用自己的服务器做301跳转当然也可以，但这样根域名就不在CDN上了，也违背了我最初选择Serverless的初衷。&lt;/p&gt;
&lt;h2 id=&quot;自制cname展平&quot;&gt;自制CNAME展平&lt;/h2&gt;
&lt;p&gt;CNAME展平的原理并不复杂，DNS服务商会替你将CNAME解析到最终的IP，再以A记录的形式返回。这一步完全可以自己来完成：定时查询EdgeOne分配给根域名的地址解析到了哪些IP，再将结果写入DNSPod的A记录即可。而A记录与MX记录是可以共存的，域名邮箱也就不会受到影响。&lt;/p&gt;
&lt;p&gt;这里的难点在于，CDN会根据访客所在的位置返回不同的节点。而脚本运行在Github Actions上，机器位于美国，直接查询只能拿到海外节点。&lt;/p&gt;
&lt;p&gt;解决的办法是EDNS Client Subnet（ECS）。在查询时附带一个网段，EdgeOne便会认为这是替该网段的用户发起的查询。Google与阿里的DoH接口都支持这一参数。经过测试，附带电信的网段会返回电信节点，附带联通的网段会返回联通节点，附带美国的网段则会返回海外节点，与预期一致。&lt;/p&gt;
&lt;p&gt;DNSPod的免费版本身就支持按线路解析，电信、联通、移动、教育网、境内和境外都可以分别设置。因此脚本只需针对每条线路，用对应运营商的网段查询一次，再将结果写到这条线路上：&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;code-lang&quot;&gt;JavaScript&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-code-block=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-comment)&quot;&gt;// DNSPod line → a Shanghai client subnet of that network (abroad for &quot;默认&quot;).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; TELECOM&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;202.96.209.0/24&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; LINES&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  { line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;电信&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; TELECOM&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  { line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;联通&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;210.22.70.0/24&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  { line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;移动&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;211.136.112.0/24&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  { line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;教育网&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;202.120.2.0/24&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  { line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;境内&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; TELECOM&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  { line&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;默认&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;8.8.8.0/24&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; RESOLVERS&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  (name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet) &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; `https://dns.google/resolve?name=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;amp;type=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;amp;edns_client_subnet=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  (name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; subnet) &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; `https://dns.alidns.com/resolve?name=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;amp;type=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;type &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;A&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 28&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&amp;amp;edns_client_subnet=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;subnet&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;境内线路默认用电信老大哥，而请求中ECS选择的IP网段地域我用的都是上海地区的IP。上海地区位于华东，全国的距离都不会太远，且直辖市位于网络骨干。&lt;/p&gt;
&lt;p&gt;另外也不得不感谢腾讯云海外给的IP都是AnyCast任播IP，使得其他国家我不需要操心分流的问题。&lt;/p&gt;
&lt;h2 id=&quot;通过github-actions定时运行&quot;&gt;通过Github Actions定时运行&lt;/h2&gt;
&lt;p&gt;脚本每5分钟运行一次，这是Github定时任务允许的最短间隔。而DNSPod免费版的TTL最低为600秒，再频繁也没有意义。大部分时候IP并不会变化，脚本十几秒便能运行完毕。&lt;/p&gt;
&lt;p&gt;需要注意的是，公开仓库如果60天没有提交，Github会自动停用定时任务。因此我在工作流的最后加了一步，每次运行时调用一次启用工作流的接口，以重置这一计时：&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;code-lang&quot;&gt;YAML&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-code-block=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; Keep the schedule alive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; ${{ always() }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  run&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; gh api -X PUT &quot;repos/$GITHUB_REPOSITORY/actions/workflows/dns-flatten.yml/enable&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  env&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;    GH_TOKEN&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; ${{ github.token }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;根域名跳转至www&quot;&gt;根域名跳转至www&lt;/h2&gt;
&lt;p&gt;根域名的请求到达EdgeOne之后，交由Makers的中间件处理，路径和参数会一并保留：&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;code-lang&quot;&gt;JavaScript&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-code-block=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; middleware&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;({ request&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; redirect&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; next }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.hostname &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;leekarl.com&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;    url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.protocol &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;https:&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;    url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.hostname &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;www.leekarl.com&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;    url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.port &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; redirect&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt;.toString&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 301&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;.pathname &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; &apos;/middleware.js&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; Response&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt;&apos;Not Found&apos;&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; { status&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-constant)&quot;&gt; 404&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-function)&quot;&gt; next&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;由于我是将构建好的&lt;code&gt;dist&lt;/code&gt;目录直接上传的，&lt;code&gt;middleware.js&lt;/code&gt;也会被作为静态文件一同上传，因此中间件中还额外让&lt;code&gt;/middleware.js&lt;/code&gt;返回404，避免源码被直接访问。&lt;/p&gt;
&lt;p&gt;部署步骤则加在原有的Github Pages工作流之后，一次构建，同时部署到两边：&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;code-lang&quot;&gt;YAML&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code css-variables&quot; style=&quot;background-color:var(--astro-code-background);color:var(--astro-code-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-code-block=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-foreground)&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; Deploy to EdgeOne Makers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  run&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string)&quot;&gt;    cp makers/middleware.js dist/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-string)&quot;&gt;    npx --yes edgeone@1.7.2 makers deploy dist -n leekarl-homepage -t &quot;$EDGEONE_API_TOKEN&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;  env&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;    EDGEONE_API_TOKEN&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--astro-code-token-string-expression)&quot;&gt; ${{ secrets.EDGEONE_API_TOKEN }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
</content:encoded><category>edgeone</category><category>dns</category><category>github-actions</category><category>cdn</category></item></channel></rss>