本文へ移動
技術を、自社の仕事に。
判断と実行を助けるメディア

記事を検索

Astro 7.4.5で修正 環境変数の「$」がビルドで壊れる不具合を再現

目次 · 6項目

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のエスケープの &amp; は & に戻して表記)。

版分割代入プロパティの参照
7.2.2A$B__astro_import_meta_env_____…_____C(壊れる)A$$B$&C
7.4.4A$B__astro_import_meta_env_____…_____C(壊れる)A$$B$&C
7.4.5A$$B$&CA$$B$&C

分割代入では、$$ が $ 1文字になり、$& の位置に __astro_import_meta_env で始まる内部の文字列が入りました。置換の特別な並びがそのまま効いた形です。プロパティの参照(import.meta.env.MY_SECRET)は、3つの版とも正しい値でした。7.4.5では、分割代入も正しい値になりました。

Astroの3つの版のビルド結果の比較図。環境変数MY_SECRETにA$$B$&#x26;Cを設定し、分割代入で読むと7.2.2と7.4.4ではA$Bのあとに__astro_import_meta_envで始まる内部の文字列が入りCで終わる値に壊れ、7.4.5では正しい値になる。プロパティの参照は3つの版とも正しい

検証の途中で気づいた点もあります。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件で、このサイトはこの不具合の影響を受けません。ただし、分割代入は複数の値をまとめて読むときに自然に選べる書き方で、変更履歴の例もこの形です。外部に制作を任せたサイトでは、コードを確認するまで影響の有無は分かりません。

確認の順番を整理します。

  1. 上のgrepで、オブジェクトのまま読んでいる箇所を探す
  2. 見つかったら、使っている環境変数の値に $ が入っているかを確かめる(値そのものは画面やログに出さない)
  3. 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制作・リニューアル相談からご相談ください。

参考資料

この記事を共有XFacebook
鈴木 翔

技術の可能性に魅了され、学生時代からプログラミングとデジタルアートの分野に深い関心を持つ

この記事のテーマを、自社の次の一歩へ

Webサイトで、実現したいことから。

使う人の目的、必要な機能、更新の体制を整理し、制作・改善で最初に取り組むことを考えます。

  • サイトの目的
  • 機能と使いやすさ
  • 公開後の運用
Web制作・改善を相談する

構想段階からご相談いただけます。この記事の情報を相談フォームに引き継ぎます。

最新記事をメールで受け取る・Web制作ガイドを読む
無料ダウンロード

Web制作 費用・発注・集客 完全ガイド【2026年版】

費用相場・制作会社の選び方・集客戦略をPDFにまとめました。

The PDF and newsletter emails are currently in Japanese.

メルマガにも登録されます。いつでも解除可能です。