Owszem są rozwiązania, ale są one piramidalnie skomplikowane. Ajaxy...
Parafrazując: "Nie taki ajax (w przykładzie użyto fetch) straszny jak go malują", IMO przykładowy kod uproszczony do minimum:
index.php
<?php
session_start();
$_SESSION['page'] = $_GET['page'] ?? $_SESSION['page'] ?? 'home';
if (! isset(pathinfo($_SESSION['page'])['extension']))
$_SESSION['page'] .= '.html';
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html,
body {
padding: 0;
margin: 0;
}
.main-container {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 100px auto 50px;
gap: 0px;
width: min(1000px, 90dvw);
height: auto;
margin: 0 auto;
}
header {
grid-column: 1 / span 2;
grid-row: 1;
background-color: hsl(100 90% 80% /.9);
}
nav,
main {
margin: 0;
padding: 1rem;
}
nav {
grid-column: 1;
grid-row: 2;
background-color: hsl(0 0% 0% /.4);
}
main {
grid-column: 2;
grid-row: 2;
background-color: hsl(0 0% 0% /.2);
}
footer {
grid-column: 1 / span 2;
grid-row: 3;
background-color: hsl(200 90% 80% /.9);
}
nav ul {
list-style: none;
}
</style>
</head>
<body>
<div class="main-container">
<header>
<!-- kod html dla nagłówka -->
</header>
<nav>
<ul>
<li><a href="?page=home">Strona główna</a></li>
<li><a href="?page=page_1">Strona 1</a></li>
<li><a href="?page=page_2">Strona 2</a></li>
<li><a href="?page=contact">Kontak</a></li>
<li><a href="?page=about_us">O Nas</a></li>
</ul>
</nav>
<main>
<?php echo file_get_contents($_SESSION['page']); ?>
</main>
<footer>
<!-- kod html dla stopki -->
</footer>
</div>
<script>
const nav = document.querySelector('nav ul');
nav.addEventListener('click', menu);
async function menu(e) {
e.preventDefault();
if (e.target.matches('a[href*="page"]')) {
const param = new URL(e.target.href).searchParams.get('page');
const response = await fetch(`page.php?page=${param}`);
const page = await response.text();
document.querySelector('main').innerHTML = page;
}
}
</script>
</body>
</html>
page.php
<?php
session_start();
$_SESSION['page'] = $_GET['page'] ?? 'home';
if (! isset(pathinfo($_SESSION['page'])['extension']))
$_SESSION['page'] .= '.html';
echo file_get_contents($_SESSION['page']);
?>
home.html
<h1>Strona główna</h1>
<article>
<h2>Lorem 1</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</article>
<article>
<h2>Lorem 2</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</article>
<article>
<h2>Lorem 3</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</article>

trzeba zaznaczyć, że takie podejście nie jest za bardzo SEO frendly.
Ale nie rozwiązuje ona problemu przeładowywania całej strony
np. użycie sesji jak w powyższym przykładzie.
jest nią funkcja "include" w php
sprawdź np.: file_get_contents,
P.S.
[ Co to jest .htaccess? Co to znaczy i czym jest plik .htaccess? ]
[ What does double question mark (??) operator mean in PHP ]
[ CSS Selector Reference ]