diff --git a/.changeset/khaki-schools-reflect.md b/.changeset/khaki-schools-reflect.md
new file mode 100644
index 000000000..4de81a006
--- /dev/null
+++ b/.changeset/khaki-schools-reflect.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/compiler': patch
+---
+
+Fix issue with head content being pushed into body
diff --git a/internal/parser.go b/internal/parser.go
index 18275683a..12c610163 100644
--- a/internal/parser.go
+++ b/internal/parser.go
@@ -392,6 +392,7 @@ func (p *parser) addExpression() {
 		HandledScript: false,
 		Loc:           p.generateLoc(),
 	})
+
 }
 
 func isFragment(data string) bool {
@@ -942,6 +943,7 @@ func inHeadIM(p *parser) bool {
 	case StartExpressionToken:
 		p.addExpression()
 		p.afe = append(p.afe, &scopeMarker)
+		p.templateStack = append(p.templateStack, inExpressionIM)
 		if p.originalIM == nil {
 			p.setOriginalIM()
 		}
diff --git a/internal/printer/printer_test.go b/internal/printer/printer_test.go
index 938e3c4e8..bbcfb40cb 100644
--- a/internal/printer/printer_test.go
+++ b/internal/printer/printer_test.go
@@ -551,6 +551,7 @@ import type data from "test"
 		}
 	</main>
 </Layout>`,
+
 			want: want{
 				code: `${$$renderComponent($$result,'Layout',Layout,{"title":"Welcome to Astro."},{"default": () => $$render` + BACKTICK + `
 	${$$maybeRenderHead($$result)}<main>
@@ -569,8 +570,8 @@ import type data from "test"
 					</div>
 					<p>
 						</p><h2>p+h2 ${dummyKey}</h2>
-					` + BACKTICK + `	
-			);
+					` + BACKTICK + `
+				);
 			})
 		}
 	</main>
@@ -3505,6 +3506,31 @@ const items = ["Dog", "Cat", "Platipus"];
 				code: `${$$renderComponent($$result,'Component',Component,{})}${(void 0)}`,
 			},
 		},
+		{
+			name: "nested head content stays in the head",
+			source: `---
+const meta = { title: 'My App' };
+---
+
+<html>
+	<head>
+		<meta charset="utf-8" />
+
+		{
+			meta && <title>{meta.title}</title>
+		}
+
+		<meta name="after">
+	</head>
+	<body>
+		<h1>My App</h1>
+	</body>
+</html>`,
+			want: want{
+				frontmatter: []string{"", `const meta = { title: 'My App' };`},
+				code:        `<html>	<head>		<meta charset="utf-8">		${			meta && $$render` + BACKTICK + `<title>${meta.title}</title>` + BACKTICK + `		}		<meta name="after">	${$$renderHead($$result)}</head>	<body>		<h1>My App</h1>	</body></html>`,
+			},
+		},
 	}
 
 	for _, tt := range tests {
@@ -3535,6 +3561,7 @@ const items = ["Dog", "Cat", "Platipus"];
 				RenderScript: tt.transformOptions.RenderScript,
 			}
 			transform.Transform(doc, transformOptions, h) // note: we want to test Transform in context here, but more advanced cases could be tested separately
+
 			result := PrintToJS(code, doc, 0, transform.TransformOptions{
 				Scope:                   "XXXX",
 				InternalURL:             "http://localhost:3000/",