.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 -
(.*)speichertaporie.meals%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 nachfolgendehttps://%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 gelesenRewriteRule– 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`