El index.php lo empezarias de la siguiente manera:
1. Con el require de tu framework, si usas uno.
2. Seguidamente inicializas tus clases.
3. Coges el url de $_SERVER['REQUEST_URI'] (comprobandolo y limpiandolo).
4. Inicias la sesion (si hay usuarios).
5. Y haces la comprobación del login.
Hasta aquí tendrías algo así:
ini_set('display_errors', 1); // se cambia a 0 en producción
define('_NDTP', 'Nombre de tu Proyecto'); // o lo que quieras, luego vemos para que sirve esto
header('Content-Type: Text/HTML; Charset=UTF-8');
require('config-web.php'); //aquí yo declaro parametros como url a static y path_framework
require($path_framework . 'aet.php'); // incluyo mi framework
//$flood = new FloodDetection();
//$flood->check();
$web_user = new web_user();
$functions = new functions();
$property = new Property();
$AddressBook = new AddressBook();
//CHECK URL WITH SECURITY
$url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH
); $url = $functions->esc_url($url);
$web_user->sec_session_start(); // mi clase custom para la sesión, es recomendable configurarla bien
$client = $web_user->login_check(); // FALSE OR CLIENT
Si vas a tener usuario, ahora mismo sabríamos si el usuario se ha identificado o no. Si no está identificado entonces $client sera FALSE, pero si lo ha hecho entonces $client será un objeto de clase con la información del usuario (y podremos llamar las funciones de la clase client()).
Ahora viene lo de las url:
1. Hay que comprobar, con un if por ejemplo, si el usuario se ha logueado o no, para mostrar unas páginas u otras.
2. Crear un array para cada caso, que será un whitelist de lás páginas disponibles.
Sería algo así el código:
$pages = 'pages/';
if ( FALSE !== $client ) {
// client's most needed data
$clientId = $client->getId();
$isParticular = $client->getIsParticular();
// en caso de necesitar incluir código antes del output (principalmente para hacer redirecciones header)
// en caso de que ejecutarse el código de estos archivos, debería o bien hacer la redireccion o terminar la ejecución con un die()
switch ($url) {
case '/get' : include($pages . 'get.php'); break; // header('Location: /...') or die('error');
case '/post' : include($pages . 'post.php'); break; // header('Location: /...') or die('error');
case '/logout' : include($pages . 'headers/logout.php'); break; // header('Location: /...') or die('error');
}
// el whitelist de las páginas disponibles solo para los usuarios registrados
$includes_var = [
'/test' => $pages . 'test.php',
'/account' => $pages . 'account.php',
'/property' => $pages . 'property.php',
'/change_pwd' => $pages . 'change_pwd.php'
];
}
else {
// aquí lo mismo, si se ejecuta el script debe o bien redirigir o detenerlo con die en caso de error.
// para que no se muestre el resto de la página despues del error
switch ($url) {
case '/activateAccount' : include($pages . 'activate_acc.php'); break; // header('Location: /...') or die('error');
case '/login' : include($pages . 'headers/login_post.php'); break; // header('Location: /...') or die('error');
}
// otro whitelist de las páginas disponibles en caso de no haberse identificado
$includes_var = [
'/test' => $pages . 'test.php',
'/404' => $pages . '404.php',
'/login' => $pages . 'login.php',
'/resend_email' => $pages . 'resend_email.php'
];
}
// si $url == '' entonces le damos el url de la página principal
$url = $url ?: '/home';
// aqui tenemos el whitelist de las páginas que siempre están disponibles para todos
$includes = [
'/404' => $pages . '404.php',
'/help' => $pages . 'help.php',
'/home' => $pages . 'home.php'
];
Como puedes ver, ahora tenemos un array con todas las páginas permitidas.
Lo siguiente sería saber cual es el título de la página, y todo lo demás que dependa de la página actual, como los meta:
//CHECK TRANSLATION
$lang = locales::instantiate($client);
//GET TITLE
$title = $lang->getW($include);
Como te comenté anteriormente, tengo una clase abstracta que inicializa un idioma basado en diferentes factores (primero la opción que haya elegido el usuario en su cuenta y segundo el idioma de su navegador), una vez inicializada la función se le pueden pasar keys (que en este caso sería la url) y te devuelve el texto correspondiente. Tu puedes hacerlo como quieras.
Y por ultimo se incluye el main.php:
include('pages/main/main.php');
Bien, ahora vamos a usar el define() de arriba del todo, esto es basicamente para que los archivos no se accedan directamente y solo puedan ser mostrados mediante el index.php.
También aprovecho para mostrarte como incluir las páginas dentro de main.php:
La estructura del archivo main.php es muy simple, primero se comprueba con defined (por lo indicado arriba) y luego se empieza la estructura normal del html. Ahora incluir las páginas, yo te recomiendo que lo hagas dentro de la etiqueta <main> (que debería ir dentro de <body>):
main.php:
<?php
// Esto quiere decir que si no esta definido el key se termina la ejecución y no se muestra nada
// solo debería ocurrir cuando se intenta acceder directamente al archivo y no cuando se incluye
// ya que en index.php está definido el key. Esto habría que ponerlo en todos los archivos de tu web
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="Text/HTML" charset="UTF-8" />
<meta name="keywords" content="google" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NombreWeb | <?= $title ?></title>
<meta name="author" content="" href="" />
<meta name="copyright" content="© NombreWeb
<?= date("Y") ?>" />
<link rel="shortcut icon" href="<?= $path_static; ?>images/favicon.ico" />
<link rel="StyleSheet" type="text/CSS" media="all" href="<?= $path_static; ?>css/styles.css" />
<script type="text/javascript" src="<?= $path_static ?>js/scripts.js"></script>
</head>
<body>
<header>
</header>
<main>
<?= include($includes[$include]); ?>
</main>
<footer>
</footer>
</body>
</html>
Otra cosa importante son los archivos estáticos, como imagenes, jscripts, css, etc. Estos deberían ir en un subdominio, propiamente llamano static.tuweb.com y que preferiblemente tenga php desactivado, más que nada por si permites subir archivos que no se ejecuten.
Pero la razón por la que hay que hacer esto así es porque tu dominio principal no va a aceptar urls normales, como por ejemplo /jscripts/scripts.js o /images/logo.jpg ya que vas a usar las friendly urls para navegar como /home o /account, etc... Que basicamente son los indexes de tu array $includes, estos deben ser las urls.
Para ello tienes que poner el siguiente código en tu .htaccess:
Options -Indexes
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index\.php$ - [L]
RewriteRule . index.php [L]
</IfModule>
Esto lo que hace es basicamente redirigir todas las peticiones a tu archivo index.php que ahora hace de router. Apache ya no lo usas para navegar por tu sitio, ahora es tu index.php el que se encarga de eso, pero para ello, hay que pasarle todas las peticiones para saber cual es la url a acceder.
Cualquier duda mañana te respondo que hay sueño
Espero que se haya entendido