APIのキーやパスワードに $ が入っていると、Astroのサイトで、astro build の結果でだけ値が変わることがありました。その値で外部のAPIの認証をしていれば、本番だけ失敗することになります。不具合の報告によると開発サーバーでは正しい値になるので、原因が値そのものにあるとは気づきにくい不具合です。
2026年11月2日にnpmに公開されたAstro 7.4.5の変更履歴に、この種の不具合の修正が入りました。編集部では、修正前後の版で同じページをビルドして、実際に値が壊れることと、7.4.5で直ることを確かめました。2026年11月6日の時点では、さらに新しい7.4.6と7.4.7も公開されています。
変更履歴に書かれた不具合
Astroのリポジトリの packages/astro/CHANGELOG.md には、7.4.5の修正として次の記載があります(要約)。
サーバー側のコードが
import.meta.envのオブジェクトを直接読むとき(例const { MY_SECRET } = import.meta.env)、$$や$&のような$の並びを含む値がastro buildで壊れていた不具合を修正
$$ と $& は、JavaScriptの String.prototype.replace の置換の文字列で特別な意味を持つ並びです。$$ は $ 1文字に、$& は置換の対象になった文字列そのものに置き換わります。値をそのまま埋め込むはずの処理で、この特別な意味が効いてしまうと値が変わります。
修正のプルリクエスト(#18559)によると、原因は String.prototype.replaceAll に値を文字列のまま渡していたことで、関数を渡す形に直されました(replaceAll の置換の文字列の意味は replace と同じです)。プルリクエストと報告のissue(#18557)は、const env = import.meta.env のように変数に入れる書き方も対象に挙げています。$` や $' を含む値では、値が変わるのではなくビルドが PARSE_ERROR で失敗すると報告されています(この2つは編集部では検証していません)。
3つの版でビルドして確かめた
同じ条件で、3つの版を比べました。
- 環境: クラウドの作業環境のLinux、Node.js 22.23.4
- 版: Astro 7.2.2(7.2系の例)、7.4.4(修正の直前の版)、7.4.5(修正を含む版)
- 入力: 環境変数
MY_SECRETにA$$B$&Cを設定してastro buildを実行 - ページ: 同じ値を、分割代入と、プロパティの参照の2通りで出力
---
const { MY_SECRET } = import.meta.env; // 分割代入
const direct = import.meta.env.MY_SECRET; // プロパティの参照
---
<p id="destructured">{MY_SECRET}</p>
<p id="direct">{direct}</p>
ビルドした dist/index.html の出力は次のとおりです(HTMLのエスケープの & は & に戻して表記)。
| 版 | 分割代入 | プロパティの参照 |
|---|---|---|
| 7.2.2 | A$B__astro_import_meta_env_____…_____C(壊れる) | A$$B$&C |
| 7.4.4 | A$B__astro_import_meta_env_____…_____C(壊れる) | A$$B$&C |
| 7.4.5 | A$$B$&C | A$$B$&C |
分割代入では、$$ が $ 1文字になり、$& の位置に __astro_import_meta_env で始まる内部の文字列が入りました。置換の特別な並びがそのまま効いた形です。プロパティの参照(import.meta.env.MY_SECRET)は、3つの版とも正しい値でした。7.4.5では、分割代入も正しい値になりました。

検証の途中で気づいた点もあります。7.2.2で、値を .env ファイルに ab$$cd$&ef と書いた場合は、プロパティの参照でも ab$$&ef になり、$cd の部分が消えました。Viteの資料によると、.env の値はdotenv-expandで変数として展開され、$ を値に含めるには \ でエスケープします(Astroの環境変数の読み込みはViteの loadEnv を使っています)。.env の書き方の影響と、今回の不具合を切り分けるため、表の結果は環境変数で値を渡して取っています。$ を含む値を .env に書く場合は、エスケープしたうえで、ビルドの結果で値を確かめてください(エスケープした場合の結果は編集部では検証していません)。
自社のサイトで影響を調べる
影響を受けるのは、import.meta.env をオブジェクトのまま読むコードです。Astroのソースでは、import.meta.env のあとに . が続かない書き方が、この処理の対象です。次のgrepで同じ条件の箇所を探せます。分割代入、スプレッド、const env = import.meta.env、import.meta.env[key]、関数への受け渡しが見つかります。
grep -rnE 'import\.meta\.env([^.A-Za-z0-9_$]|$)' src
このサイトのソース(記事の本文を除く src)で調べると、import.meta.env の参照は4か所で、すべて import.meta.env.PROD のようなプロパティの参照でした。上のgrepの該当は0件で、このサイトはこの不具合の影響を受けません。ただし、分割代入は複数の値をまとめて読むときに自然に選べる書き方で、変更履歴の例もこの形です。外部に制作を任せたサイトでは、コードを確認するまで影響の有無は分かりません。
確認の順番を整理します。
- 上のgrepで、オブジェクトのまま読んでいる箇所を探す
- 見つかったら、使っている環境変数の値に
$が入っているかを確かめる(値そのものは画面やログに出さない) - 7.4.5以降に上げる(2026年11月6日時点の最新は7.4.7)。すぐに上げられない場合は、
import.meta.env.KEYの形に書き換える
7.4.5のほかの変更
7.4.5には、ほかに3つの修正が入っています(変更履歴の記載。編集部では検証していません)。
- 不正なパーセントエンコーディングを含むパス(例
/%C0%AFや単独の%)が、Invalid URL encodingのエラーとして記録され、デコードされないまま振り分けられていた。今後は400を返す .astroの動的なタグ、JSX、MDXで、文字列のタグ名の扱いが厳しくなった。有効な要素名の部分だけが出力され、/や=でマークアップを変えられなくなる。要素名で始まらない文字列('!--'や空文字)はエラーになる- サンドボックスや別の利用者から
astro dev statusなどを実行したとき、動いている開発・プレビューサーバーのロックファイルを消してしまう不具合
2つ目は、タグ名を外部のデータから組み立てているコードがあると、上げたあとにエラーになる可能性があります。上げる前に、動的なタグを使っている箇所を確かめておくと安全です。
7.4.6と7.4.7は2026年11月5日に公開されました。7.4.6はi18nのフォールバックや astro check の終了コードなどの修正、7.4.7は画像のエンドポイントの修正です(変更履歴の記載)。今回の修正は7.4.7のソースにも残っていることを確かめましたが、この2つの版でのビルドは検証していません。
7.2系から上げる場合は、7.4.2で最小のNode.jsが22.23.4に上がっている点にも注意が要ります(変更履歴の記載)。書き換えだけで古い版に留まると、別のアドバイザリは残ります。たとえば7.2.8未満にはGHSA-26w7-cxv4-gfx2(信頼できないAVIF画像の最適化による遠隔コード実行)、7.3.2未満にはGHSA-98hj-9722-w3j8(JSX・MDXのscript・style要素でのXSS)があります。ビルドの環境のNode.jsの版の固定はCloudflare Workers BuildsのNode.jsの版の記事、7.4の変更点はAstro 7.4の記事で扱っています。
確認した範囲
2026年11月4日と11月6日に、AstroのリポジトリのCHANGELOG(packages/astro/CHANGELOG.md)を取得し、7.4.5から7.4.7の記載を確認しました。npmのレジストリで7.4.5の公開日(2026年11月2日)と最新版を、MDNのリポジトリ(mdn/content)で
replaceの$$・$&の意味を確認しました。11月6日には、issue #18557、プルリクエスト #18559、7.4.7のソース、GitHubのアドバイザリ、Viteの資料も確認しました。検証は2026年11月4日に、編集部の作業用のディレクトリで、Astro 7.2.2・7.4.4・7.4.5の3つの版に同じページを置き、静的なビルドで行いました(各版1回)。サーバーで描画する構成(アダプターを使う構成)、astro:envを使う書き方、開発サーバーでの挙動、7.4.6と7.4.7でのビルドは検証していません。
Astroで作ったサイトの保守や、版の上げ方は、HP制作・リニューアル相談からご相談ください。
参考資料
- astro/packages/astro/CHANGELOG.md(withastro/astro)
- astro(npm)
- Build corrupts import.meta.env values containing $ when a file reads the env object(issue #18557)
- Fix build corruption of import.meta.env values containing $(PR #18559)
- GHSA-26w7-cxv4-gfx2(Astroのアドバイザリ)
- GHSA-98hj-9722-w3j8(Astroのアドバイザリ)
- Env Variables and Modes(Vite)
- String.prototype.replace()(MDN)









