Teil 2 htaccess und index.php

Für das CMS sind die beiden Server-Dateien htaccess und index.php die Schaltzentralen des CMS.

Inhalt

Vorbereitungen in der htaccess

Bevor Sie jedoch den ersten PHP-Befehl für Ihr eigenes CMS schreiben, müssen Sie die Domain und das Serververzeichnis etwas vorbereiten. Dafür müssen Sie etwas über suchmaschinenfreundliche URL wissen. Sie können die verpflichtende index.php mit den folgenden Requests implizit ansprechen:

www.domain.de/index.php?kategorie=music&beitrag=dawid-bowie

Parametrisierte URL

und

www.domain.de/music/dawid-bowie

Suchmaschinenfreundliche URL

Beide Varianten sind technisch betrachtet vollkommen korrekt und funktionieren wirklich tadellos, allerdings findet die Suchmaschine Google die erste Version der URL nicht so toll und straft solche Webseiten mit etwas schlechterem Ranking in den Suchergebnissen ab, da sie für das menschliche Auge etwas kompliziert zu entschlüsseln ist.

Suchmaschinen freundliche URL

Ihr eigenes CMS soll also eine canonische URL bzw. eine suchmaschinenfreundliche URL besitzen, daher werden alle Anfragen an die Webseite an die index.php umgeleitet, dadurch empfängt das index.php Script jedweden Request in der $_SERVER['REQUEST_URI'] und kann diese verarbeiten.

RewriteEngine On
RewriteBase /

# Process by index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [L]

# Prevent Filebrowsing
Options All -Indexes

die htaccess mit Umleitung auf index.php

Die Optionen -f und -d sorgen dafür, das die Umleitung für Files und Directorys gilt. Die Anweisung [L] zeigt dem Interpreter, das es sich um den Letzten Befehl der RewriteCondition handelt.

Nützlicher Nebeneffekt dieser Technik ist, das Sie nach außen nicht offenbaren müssen, mit welchen internen Parametern Ihr eigenes CMS arbeitet, Sie verbergen die innere Struktur des Systems nach außen.

Das Startscript index.php

Durch die Umleitung in der htaccess, kann das Startscript index.php alle Anfragen des Lesers empfangen. Die Datei index.php ist die Schaltzentrale und erste Einstiegspunkt des CMS. Mit dem Befehl require_once() werden zunächst alle weiteren PHP-Scripte dem System hinzugeladen die später gebraucht werden.

require_once('core/mvc/Controller.php');
require_once('core/mvc/Model.php');
require_once('core/mvc/View.php');
require_once('core/dipper/Dipper.php');
require_once('core/parsedown/Parsedown.php');

$url = 'content/'.$_SERVER['REQUEST_URI'];
if (substr($url, -1) == '/') $url = substr($url, 0, -1);

if (is_dir($url))
{
    if(file_exists($url.'/index.md'))
    {
        $categorie = new Controller($url.'/index.md');
    } else {
        echo 'Kategorie: index.md nicht gefunden';
        exit();
    }
} else {
    if(file_exists($url.'.md'))
    {
        $post = new Controller($url.'.md');
    } else {
        echo 'Beitrag: beitrag.md nicht gefunden';
        exit();
    }
}

Startscript index.php

Die Variable $url wird den URL-Request des Lesers aufnehmen und es dem Beitragsverzeichnis content zugewiesen. Der folgende if(substr(...) soll dafür sorgen, das anhängende / immer abgeschnitten werden, das macht die weitere Verarbeitung deutlich einfacher.

Im wesentlichen folgt mit if (is_dir($url))... eine Kontrollstruktur, die untersucht, ob es sich bei der URL um eine Kategorie oder einen Beitrag handelt. In Abhängigkeit der logischen Auswertung, startet das Index-Script den dazugehörigen Controller (derzeigt gibt es nur einen einzigen, universellen Controller).

Eine Kategorie mit der Datei index.md und ein Beitrag mit beitrag.md weisen die identische innere YAML Struktur auf und können daher von einem gemeinsamen Controller gleichermaßen verarbeitet werden, eine Trennung wäre daher nicht nötig.

Verzeichnis-Struktur

Das Projekt zur Entwicklung Ihres eigenen CMS ist in die folgende übersichtliche Verzeichnis-Struktur aufgeteilt.

root:
─────
│
├── content                             // hier liegt der Beitrags-Content
│       │
│       ├── kategorie-1                 // eine Kategorie
│       │       │
│       │       ├── index.md            // Beschreibung der Kategorie
│       │       ├── beitrag-1.md        // erster Beitrag in der kategorie
│       │       └── beitrag-2.md        // weitere Beiträge
│       │
│       └── kategorie-2
│               │
│               ├── index.md            // Kategorie-Beschreibung
│               ├── beitrag-1.md        // Beiträge
│               .
│
├── core
│       │
│       ├── dipper
│       │       │
│       │       └── Dipper.php          // YAML-Parser
│       ├── parsedown
│       │       │
│       │       └── Parsedown.php       // Parser zum übersetzen des Textes in HTML
│       └── mvc ┐                       // In diesem Verzeichnis lagern
│               │                       // die Komponenten des MVC-Patterns
│               ├── Controller.php      // Controller
│               ├── Model.php           // Model
│               └── View.php            // und View
│
├── img                                 // hier liegen alle Bilder
│
├── templates
│       │
│       └── basic.template              // das HTML-template der Seite
│
htaccess                                // Umleitungen auf index.php
index.php                               // Startscript der Webseite

Verzeichnis-Struktur

Da die Anzahl der MVC-Komponenten überschaubar ist, reicht es aus, diese gemeinsam im Ordner mvc abzulegen. Sollte das Projekt später größer werden, kann die Struktur weiter verändert werden.

Die Pakete Dipper und Parsedown werden in späteren Kapiteln rund um die Templates und Beiträge genauer besprochen und sind hier als Vorgriff schon zu sehen.


Oliver Lohse
2024-02-15
ein eigenes CMS entwickeln programmieren
post
0