.htaccess – Grundlagen & Verständnis

Zur Erklärung von 
.htaccess wird das folgende 
mod_rewrite-Beispiel genutzt.
Damit lassen sich URL-Strukturen verstehen und eigene Regeln sauber aufbauen.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    # %{HTTP_HOST} enthält den Hostnamen der Anfrage
    # [NC] No Case - Groß-/Kleinschreibung ignorieren
    # [L] Last - keine weiteren Regeln anwenden
    # [QSA] Query String Append - vorhandene Query-Parameter beibehalten
    # "www" entfernen
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^ https://%1%{REQUEST_URI} [L]
    # Download Server - download.aporie.me
    RewriteRule ^download/([^/]+)/([^/]+)$ index.php?controller=download&source=$1&file=$2 [QSA,L]
    # Shell-Subdomain - shell.aporie.me
    RewriteCond %{HTTP_HOST} ^shell\.aporie\.me$ [NC]
    RewriteRule ^([^/]+)$ index.php?controller=shell&action=$1 [QSA,L]
    # Addons
    RewriteRule ^addons/([^/]+)$ index.php?controller=addons&browser=$1 [QSA,L]
    # Catch-All für Seiten
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/?(.*)$ index.php?controller=$1&action=$2 [QSA,L]
</IfModule>
RegEx-Basics
RegEx beschreibt, wie eine URL aussehen muss, damit eine Regel greift.
Typische Bausteine:
^        → Start der URL
$        → Ende der URL
/        → echter Slash
[^/]     → alles außer Slash
+        → mindestens 1 Zeichen
(...)    → Gruppe (wird später als $1, $2 genutzt)
Beispiel:
^download/([^/]+)/([^/]+)$
Passt auf:
download/chrome/setup.exe
Ergebnis:
$1 = chrome
$2 = setup.exe
RewriteEngine & RewriteBase
RewriteEngine On
RewriteBase /
RewriteEngine On
Aktiviert das Rewrite-System überhaupt.
Ohne das passiert nichts.
RewriteBase /
Definiert den Basispfad für relative Regeln.
In deinem Fall:
/ = Root der Domain
alle Regeln beziehen sich auf URLs ab Root
RewriteCond
RewriteCond %{HTTP_HOST} ^www\.(.*)$
Eine Bedingung, die vor einer RewriteRule erfüllt sein muss.
Wichtige Punkte:
%{HTTP_HOST} → Domain der Anfrage
RegEx wird darauf angewendet
mehrere 
RewriteCond = UND-Verknüpfung
Beispiel:
www.aporie.me → matcht
aporie.me     → matcht nicht
RewriteRule
Grundstruktur:
RewriteRule PATTERN ZIEL [FLAGS]
Beispiel 1: www entfernen
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^ https://%1%{REQUEST_URI} [L]
Ablauf:
Domain ist 
www.aporie.me
(.*) speichert 
aporie.me als 
%1
Weiterleitung zu:
https://aporie.me/der/pfad
👉 
%{REQUEST_URI} = kompletter ursprünglicher Pfad
Beispiel 2: Download-Route
RewriteRule ^download/([^/]+)/([^/]+)$ index.php?controller=download&source=$1&file=$2 [QSA,L]
Ablauf:
URL:
/download/chrome/setup.exe
Wird intern zu:
/index.php?controller=download&source=chrome&file=setup.exe
👉 
$1, 
$2 kommen aus den RegEx-Gruppen
Beispiel 3: Shell-Subdomain
RewriteCond %{HTTP_HOST} ^shell\.aporie\.me$ [NC]
RewriteRule ^([^/]+)$ index.php?controller=shell&action=$1 [QSA,L]
Ablauf:
Nur wenn Domain = 
shell.aporie.me
URL:
/install
→ wird zu:
index.php?controller=shell&action=install
Beispiel 4: Catch-All
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?(.*)$ index.php?controller=$1&action=$2 [QSA,L]
Bedeutung:
Nur wenn:
keine echte Datei (
!-f)
kein echtes Verzeichnis (
!-d)
Dann:
/blog/post-1
→
controller = blog
action = post-1
👉 Das ist dein generisches Routing-System
FLAGS – [NC], [L], [QSA]
Flags steuern das Verhalten der Regel.
[NC] – No Case
[NC]
Groß-/Kleinschreibung ignorieren
Shell.Aporie.me = shell.aporie.me
[L] – Last
[L]
Sobald diese Regel greift:
👉 keine weiteren Regeln werden geprüft
Sehr wichtig für Kontrolle und Reihenfolge.
[QSA] – Query String Append
[QSA]
Bestehende URL-Parameter bleiben erhalten.
Beispiel:
/download/chrome/setup.exe?lang=de
→ wird zu:
index.php?...&lang=de
Ohne QSA → 
lang=de wäre weg.
Mentales Modell (wichtigster Teil)
So kannst du das System im Kopf behalten:
Anfrage kommt rein
Apache prüft Regel für Regel (von oben nach unten)
Wenn Pattern + Bedingungen passen:
URL wird intern umgebaut
ggf. wird abgebrochen ([L])
Wenn nichts greift → normale Datei wird geladen
Kurz zusammengefasst
RewriteCond → Wann gilt die Regel?
RewriteRule → Was passiert mit der URL?
RegEx → Wie muss die URL aussehen?
Flags → Wie verhält sich Apache danach?
Mündlicher Versuch der Erkläung:
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^ https://%1%{REQUEST_URI} [L]
RewriteRule ^download/([^/]+)/([^/]+)$ index.php?controller=download&source=$1&file=$2 [QSA,L]
RewriteCond – Wenn beim ersten Parameter die Regel (in RegEx ausgedrückt) vom zweiten Parameter zutrifft, wird das nächste "RewriteRule" ausgeführt
%{HTTP_HOST} – %{...} ist eine Apache-Variable und HTTP_HOST beinhaltet die Domain (fast quasi nach dem http:// kommen würde). Sowohl  "www", Subdomains und TLD → shell.aporie.me, www.aporie.me, aporie.me
^www\.(.*)$:
^www – es muss mit "www" beginnen. 
\. – darauf folgend ein Punkt. 
(.*) – 0 oder mehr Zeichen können folgen und keine Zeicheneinschränkung
$ – bis zum Variableende
RewriteRule – Wenn vorher ein RewriteCond war und die Regel zutraf, wird dieses RewriteRule ausgeführt. Wenn direkt davor keins war, wird dieses RewriteRule ausgeführt.
^ – Bedeutet Zeichenanfang und da nichts darauf folgt, bedeutet es die ganze Zeichenfolge wird ersetzt durch das nachfolgende
https://%1 – %1 beinhaltet die Zeichen aus der Klammer ( ) von RewriteCond, was die Domain ist, bloß ohne das "www"
%{REQUEST_URI} – Apache-Variable mit allem was nach der Domain (HTTP_HOST) kommt
[L] – Wenn dieses RewriteRule ausgeführt wurde, wird mit der neuen Zeichenfolge diese `.htaccess` von vorne gelesen
RewriteRule – Da direkt davorkein RewriteCond ist, wird bei zutreffen das RegEx angewendet
Die Rewrite Regeln beziehen sich hauptsächlich auf %{REQUEST_URI} und nur wenn die explizit genannt wird, dann auch die Domain/der Host.
^download/([^/]+)/([^/]+)$ – Direkt am Anfang muss ein "download" stehen + "/" + 1 bis beliebig Zeichen außer / + "/" + 1 bis beliebig Zeichen außer / + Ausdruckende ($)
index.php?controller=download&source=$1&file=$2 – Das erste "1 bis beliebig Zeichen außer /" befindet sich in $1 und das zweite "1 bis beliebig Zeichen außer /" befindet sich in $2.
Die neue Zeichenfolge ist deshalb z.B. `index.php?controller=download&source=android&file=instander`