Teil 2 htaccess und index.php


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

Vorbereitungen in der htaccess

Alle Anfragen an die Webseite müssen an die index.php umgeleitet werden, damit kann das CMS alle URL 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.

Würden Sie die Umleitung nicht vornehmen, müsste die URL etwa so aussehen:

www.domain.de/index.php?kategorie=kategorie-1&beitrag=beitrag-1

Zugegeben, das ist wenig intuitiv und die Suchmaschine mag diese Formulierung ebenso wenig und straft solche Webseiten mit schlechterem Ranking ab. Besser wäre die folgende URL:

www.domain.de/kategorie-1/beitrag-1

Die oben gezeigte URL ist für das menschliche Auge deutlich besser zu lesen und die Suchmaschine belohnt solche Webseiten mit besserem Ranking. Dies erreichen Sie mit der eingangs beschriebenen Umleitung in der htaccess.

Das Startscript index.php

Durch die Umleitung in der htaccess kann das Startscript alle Anfragen empfangen. Die Datei index.php ist die Schaltzentrale 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 einfacher.

Im wesentlichen folgt eine if-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).

Sofern die Kategorie anders verarbeitet werden soll als ein Beitrag, kann der allgemeine Controller beispielsweise in einen PostController und CategorieController aufgeteilt werden.

Verzeichnis-Struktur

Das Projekt ist in die folgende 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.


Mein Name ist Oliver Lohse. Ich bin diplomierter Wirtschafts-Informatiker und Organisations-Programmierer in verschiedenen Sprachen bzw. Markup-Dialekten, z.B. Java, JEE, COBOL, PHP, Python, MySQL, HTML, CSS, ANSI C, Lisp, Rexx, JavaScript, Scheme, ActionScript 2.0, Maschinensprache, Assembler und JCL. Seit mehr als 25 Jahren arbeite ich in einem großen Softwareunternehmen für Versicherungen in Hannover Niedersachsen.

Oliver Lohse
2024-02-15
ein eigenes CMS entwickeln programmieren
post
Kontakt@Oliver-Lohse.de

Datenschutz

Die Webseite verwendet keinerlei Tracking- oder Speichermechanismen, die einen Rückschluss auf das Leserverhalten und Ihre Identität zulassen. Die Webseite verwendet keine Cookies, denn Cookies haben einen schlechten Ruf.

Impressum

CMSWorkbench ist eine Entwicklerseite über meine Arbeit im Bereich der Content Management Systeme. Die vielen Codeschnipsel sind im wesentlichen als kleine Notizzettel zu werten als das es ausgereifte Beiträge wären.