Zur Navigation

mod_rewrite Ich kapier es nicht :-(

1 JoergB

Hallo zusammen,
seit Tagen knobel ich erfolglos an, oder besser gesagt mit dem Modul mod_rewrite herum.

Es geht dabei um ein eigenes dyndns-Script.

Die Domain und Ordnerstruktur sieht so aus:
www.subdomain.domain.de In dem Zielordner befindet sich nur die .htaccess Datei und die Ordner update und rc.
Im Ordner update die Datei update.php, die die IP in eine Textdatei schreibt.
Im Ordner rc die Datei index.php, die den den Link http://www.subdomain.domain.de?asdf.php?was&auch&immer&hier &steht
in http://8.8.8.8/asdf.php?was&auch&immer&hier &steht umwandelt.
8.8.8.8 ist eine Beispiel-IP.

Die entsprechenden PHP-Dateien arbeiten so, wie sie sollen!

Mein Problem ist, dass ich es nicht hinbekomme, dass mod_rewrite mir aus einem http://www.subdomain.domain.de/asdf.php?was&auch&immer&hier &steht ein http://www.subdomain.domain.de?asdf.php?was&auch&immer&hier &steht macht. Auch Portangaben müssen berücksichtigt werden.
http://www.subdomain.domain.de:888/asdf.php?was&auch&immer&hier &steht
in
http://www.subdomain.domain.de?:888/asdf.php?was&auch&immer&hier &steht

Mit einem meiner Versuche:
RewriteEngine on
RewriteRule ^(www.subdomain.domain.de/.*)$ http://www.subdomain.domain.de/rc/index.php?:%{SERVER_PORT}/$1/$1 [R=301,L]

geht es nicht.

Hat hie Jemand eine Idee?
Oder geht das, was ich vorhabe überhaupt?


LG Jörg

12.01.2017 13:02

2 Jörg

http://www.subdomain.domain.de?:888/asdf.php?was&auch&immer&hier &steht

Wenn ich das richtig sehe, fehlt da noch das /rc/index.php aus dem Code-Beispiel? also http://www.subdomain.domain.de/rc/index.php?:888/asdf.php?was&auch&immer&hier&steht

Der Query String was&auch&immer&hier&steht" ist in der Variablen %{QUERY_STRING} gespeichert - die Ziel-URL kannst du also folgendermaßen zusammensetzen:

RewriteRule ^/?(.*)$ http://www.subdomain.domain.de/rc/index.php?:%{SERVER_PORT}$1?%{QUERY_STRING} [R=301,L]

Ggf. würde ich : und ? innerhalb des Query Strings der Ziel-URL noch encodieren:

RewriteRule ^/?(.*)$ http://www.subdomain.domain.de/rc/index.php?%3A%{SERVER_PORT}/$1%3F%{QUERY_STRING} [R=301,L]

Der Ausdruck direkt hinter RewriteRule beinhaltet übrigens immer nur den Dateipfad der URL

12.01.2017 13:46 | geändert: 12.01.2017 13:52

3 JoergB

Hallo Jörg,
vielen Dank für deine Hilfe !!!

Prinzipiell läuft es schon, aber die Hex-Codes %3A %1A %3F bereiten noch Schwierigkeiten.
Aus %3F macht er z.B. ein F, was ja laut Hextabelle ein ? sein sollte.
Kann ich da noch was machen?

...index.phpF&show... <-- So ist das Ergebnis.
...index.php?&show... <-- So sollte es sein.

12.01.2017 17:43

4 Jörg

Stimmt, irgendwie habe ich da falsch rum gedacht :) man muss mod_rewrite hier wohl eher daran hindern, selbst zu codieren. Lass das "?" mal original so und füge noch ein Flag NE ("no escape") hinzu:

RewriteRule ^/?(.*)$ http://www.subdomain.domain.de/rc/index.php?:%{SERVER_PORT}$1?%{QUERY_STRING} [R=301,L,NE]

12.01.2017 18:11

5 JoergB

Vielen Dank, das war es. Nun läuft es so, wie es soll !!! :-))

12.01.2017 19:00

6 JoergB

Sorry, aber ich muss nochmal nerven. :D

Die Geschichte funktioniert soweit, bis man eine Portangabe macht.

bei der Eingabe von http://www.subdomain.domain.de:1234
kommt ein Seitenladefehler.

RewriteRule ^update - [L,NC] <--- Klammert den Ordner update aus, da die Fritzbox sonst die IP nicht updatet.
RewriteCond %{SERVER_PORT} 443$ <--- Prüft, ob die URL anfrage per http oder https kommt
RewriteRule ^/?(.*)$ https://www.subdomain.domain.de:80/rc/index.php?/$1?%{QUERY_STRING} [R=301,L,NE]
RewriteCond %{SERVER_PORT} !443$ <--- Prüft, ob die URL anfrage per http oder https kommt
RewriteRule ^/?(.*)$ http://www.subdomain.domain.de:80/rc/index.php?/$1?%{QUERY_STRING} [R=301,L,NE]

13.01.2017 20:16

7 Jörg

Lauscht der Webserver denn auf Port 1234?

14.01.2017 09:24

8 JoergB

So wie es aussieht nicht. :(

Mein Idianer zuhause kann und tut es. :)
Port 1234 ist nur ein Beispiel. Insgesamt sind es ca. 10 Ports, die ich brauche.

Eine URL mit Username und Passwort funktioniert auch nicht.
Username:Passwort@www.subdomain.domain.de

Ich verstehe das nicht, denn bei den Dyndns-Anbietern funktioniert das doch. Ich glaube nicht, dass deren Server auf allen Ports lauscht.

14.01.2017 12:02

9 Jörg

Für Dyndns ist in diesem Fall denke ich nur Port 53 relevant, über welchen DNS-Anfragen laufen? Die eigentliche HTTP-Anfrage inklusive Port geht an den Rechner mit der IP-Adresse, welche eine DNS-Abfrage für die betreffende Domain zurückgegeben hat.

In deinem Fall ist das anders: die HTTP-Anfrage geht an den Server, auf welchen die Subdomain subdomain.domain.de auflöst. Wenn das IP-Paket an Port 1234 gerichtet ist und dort keine Serveranwendung lauscht, dann wird dieses Paket verworfen.

14.01.2017 14:18 | geändert: 14.01.2017 14:20

10 JoergB

Zitat von Jörg
In deinem Fall ist das anders: die HTTP-Anfrage geht an den Server, auf welchen die Subdomain subdomain.domain.de auflöst. Wenn das IP-Paket an Port 1234 gerichtet ist und dort keine Serveranwendung lauscht, dann wird dieses Paket verworfen.

Das ist ja das Problem.
Ich habe schon versucht mit
RewriteRule ^(.+)\:(.+)$ $1/$2 [L]
den : in ein ein / zu ersetzen, damit der Port ins query landet. Dort könnte ich ihn in dem php-Script an die richtige Stelle setzen.

14.01.2017 17:28