# .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.

```apache
<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:

```text
^        → Start der URL
$        → Ende der URL
/        → echter Slash
[^/]     → alles außer Slash
+        → mindestens 1 Zeichen
(...)    → Gruppe (wird später als $1, $2 genutzt)

```

Beispiel:

```text
^download/([^/]+)/([^/]+)$

```

Passt auf:

```text
download/chrome/setup.exe

```

Ergebnis:

```text
$1 = chrome
$2 = setup.exe

```

---

# RewriteEngine &amp; RewriteBase

```apache
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

```apache
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:

```text
www.aporie.me → matcht
aporie.me     → matcht nicht

```

---

# RewriteRule

Grundstruktur:

```apache
RewriteRule PATTERN ZIEL [FLAGS]

```

---

## Beispiel 1: www entfernen

```apache
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^ https://%1%{REQUEST_URI} [L]

```

### Ablauf:

1. Domain ist `www.aporie.me`
2. `(.*)` speichert `aporie.me` als `%1`
3. Weiterleitung zu:

```text
https://aporie.me/der/pfad

```

👉 `%{REQUEST_URI}` = kompletter ursprünglicher Pfad

---

## Beispiel 2: Download-Route

```apache
RewriteRule ^download/([^/]+)/([^/]+)$ index.php?controller=download&source=$1&file=$2 [QSA,L]

```

### Ablauf:

URL:

```text
/download/chrome/setup.exe

```

Wird intern zu:

```text
/index.php?controller=download&source=chrome&file=setup.exe

```

👉 `$1`, `$2` kommen aus den RegEx-Gruppen

---

## Beispiel 3: Shell-Subdomain

```apache
RewriteCond %{HTTP_HOST} ^shell\.aporie\.me$ [NC]
RewriteRule ^([^/]+)$ index.php?controller=shell&action=$1 [QSA,L]

```

### Ablauf:

Nur wenn Domain = `shell.aporie.me`

URL:

```text
/install

```

→ wird zu:

```text
index.php?controller=shell&action=install

```

---

## Beispiel 4: Catch-All

```apache
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:

```text
/blog/post-1

```

→

```text
controller = blog
action = post-1

```

👉 Das ist dein generisches Routing-System

---

# FLAGS – \[NC\], \[L\], \[QSA\]

Flags steuern das Verhalten der Regel.

---

## \[NC\] – No Case

```apache
[NC]

```

Groß-/Kleinschreibung ignorieren

```text
Shell.Aporie.me = shell.aporie.me

```

---

## \[L\] – Last

```apache
[L]

```

Sobald diese Regel greift:

👉 **keine weiteren Regeln werden geprüft**

Sehr wichtig für Kontrolle und Reihenfolge.

---

## \[QSA\] – Query String Append

```apache
[QSA]

```

Bestehende URL-Parameter bleiben erhalten.

Beispiel:

```text
/download/chrome/setup.exe?lang=de

```

→ wird zu:

```text
index.php?...&lang=de

```

Ohne QSA → `lang=de` wäre weg.

---

# Mentales Modell (wichtigster Teil)

So kannst du das System im Kopf behalten:

1. Anfrage kommt rein
2. Apache prüft Regel für Regel (von oben nach unten)
3. Wenn Pattern + Bedingungen passen:
    
    
    - URL wird intern umgebaut
    - ggf. wird abgebrochen (\[L\])
4. 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&amp;source=android&amp;file=instander`