Mod-Rewrite Funktionstest

mod_rewrite will manchmal nicht das tun was ich von ihm verlange. Manchmal habe ich auch eine mir unverständliche .htaccess Datei mit mod_rewrite Regeln die ich beim besten willen nicht nachvollziehen kann und auch wieder einfach nicht das tun was die READ.ME oder der Eigentümer der Datei behauptet.

Um in einer solchen Situation feststellen zu können ob das mod_rewrite auf dem Webserver funktionsfähig ist muss ich das irgendwie testen können.

Um einen solchen Test durchzuführen benötige ich drei  Dateien.
Eine .htaccess Datei und zwei HTML Dateien.
Wenn ich dann versuche nach dem Anlegen der Dateien diese aufzurufen.

Meine .htaccess Datei erhält den folgenden Inhalt:

RewriteEngine on
RewriteBase /
RewriteRule ^testing.php$ modrewrite.php

In der ersten Zeile starte ich, so vorghanden, das mod_rewrite, so das die beiden folgenden Zeilen, RewriteBase und RewriteRule, für den Apache eine Bedeutung erhalten. In der Zweiten Zeile lege ich die Basis der Umschreibe Regel fest. In der finalen dritten Zeile der .htaccess-Datei lege ich fest das alle Aufrufe welche die Datei testing.php erreichen sollen anstelle dieser die Datei modrewrite.php erreichen.
Wenn diese Regeln greifen ist es durch diese nicht möglich den Inhalt von „testing.php“ zu erhalten.

Meine beiden PHP Dateien erhalten den folgenden Inhalt:
modrewrite.php

<?php echo "mod_rewrite und PHP ".phpversion()." sind OK"; ?>

testing.php

<?php echo "mod_rewrite ist nicht funktionsfaehig"; ?>

Nach dem Anlegen der Dateien kann im Browser versucht werden die Internetseite http://domain.tld/testing.php auszurufen. Nur wenn im Browser der Text „mod_rewrite und PHP X.Y sind OK“ erscheint funktioniert mod_rewrite. Wenn etwas anderes angezeigt wird, „mod_rewrite ist nicht funktionsfaehig“, „echo „mod_rewrite ist nicht funktionsfaehig“;“ oder sogar „Fehler 500: Internal Server Error“, ist der Webserver nicht entsprechend eingerichtet und mod_rewrite kann leider nicht genutzt werden.

HTTP Protokoll Grundlagen für Anfänger

Wie funktioniert das Internet-Protokoll HTTP?

Ganz einfach: der Client (Webbrowser) sendet eine Anfrage (GET), das Protokoll über das angefragt wird und zwei leerzeilen. Anschließend bekommt der Browser vom Server die Seite ausgeliefert:

als Browser

Auf der Linux-Shell kann eine solche Abfrage mittels Netcat (nc) und echo nachgebildet werden:

echo -e "GET / HTTP/1.1\r\nHost: www.heise.de\r\n\r\n" | nc www.heise.de 80

Die Anfrage „GET / HTTP/1.1“, die Mitteilung zu welcher Domain die Anfrage gehört (host:) und zwei Zeilenumbrüche (\r\n) werden mittels Netcat an Port 80 des Servers www.heise.de gesandt.

als Server

Auch ein HTTP-Server lässt sich auf der Linux Schell auf die gleiche weise „simulieren“:

echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nLinux, da bin ich"|nc -l 8080

Beim Aufruf der Seite in einem Browser erscheint der Text „Linux, da bin ich“ und auf der Shell erfolgt die Ausgabe des Anfrage Headers.
Der Aufruf der Seite im Firefox

GET / HTTP/1.1
Host: 85.214.55.47:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Alternativ kann der Abruf der Seite auch über den Vorangegangenen Befehl erfolgen. Die Anfrage wird von Netcat jedoch nicht geprüft, so das Du bei der Anfrage auch beliebige Zeichen in die Abfrage schreiben kannst.:

metzger@linux:~$ echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nLinux, da bin ich"|nc -l 8080 &
[1] 1465
metzger@linux:~$ echo -e "GET / HTTP/1.1\r\nHost: meins\r\n\r\n"|nc localhost 8080
GET / HTTP/1.1
Host: meins


HTTP/1.1 200 OK
Content-Type: text/html

Linux, da bin ich
[1]+ Fertig echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nLinux, da bin ich" | nc -l 8080

Allerdings ist der Aufruf der „Seite“ auf diese Weise nur ein einziges mal möglich!

Um einen wiederholten Abruf zu ermöglichen kannst Du das Netcat in eine Endlosschleife legen.:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nLinux, da bin ich"|nc -l 8080; done

 

Wie finde ich heraus ob mein Webserver die Seiten gzip komprimiert ausliefert…

Am Beispiel des Heise Servers holem wir zuerst die Daten via wget.

$ wget --header="Accept-Encoding: gzip, deflate" http://heise.de
--2012-01-04 15:50:08-- http://heise.de/
Resolving heise.de... 193.99.144.80, 2a02:2e0:3fe:100::8
Connecting to heise.de|193.99.144.80|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.heise.de/ [following]
--2012-01-04 15:50:08-- http://www.heise.de/
Resolving www.heise.de... 193.99.144.85, 2a02:2e0:3fe:100::7
Connecting to www.heise.de|193.99.144.85|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17439 (17K) [text/html]
Saving to: `index.html'

100%[=======>] 17,439 --.-K/s in 0.05s

2012-01-04 15:50:08 (316 KB/s) - `index.html' saved [17439/17439]

jetzt schauen wir, ob die geholte index Datei gzip komprimiert ist:

$ strings index.html|head -n 1
goNY

ok… das sieht nicht nach sinollem Text aus, könnte GZIP sein…
um dies zu prüfen entpacke ich die Datei mittels gzip:

$ mv index.html index.html.gz
gzip -d index.html.gz

und prüfen ob der Inhalt der Erwarteten HTML Datei entspricht.

strings index.html|head -n 1
< !DOCTYPE html>

Das ist der vollständigste Weg zu prüfen ob eine Seite von Webserver gzip koprimiert ausgeliefert wird.?