mod_rewrite

Hallo Experten,

ich muss mich auch mal an mod_rewrite versuchen, scheitere aber schon am Anfang.

Ich stelle mir derzeit sowas in der Art vor, dass jemand http://server/seite.html eingibt und dann die Seite http://server/page.php?p=seite aufgerufen wird.

Bleibt dann eigentlich die eingegebene URL in der Adresszeile stehen, oder wird da die geänderte URL stehen?

Mein Versuch ging in diese Richtung:

RewriteRule ^/(.*).html /page.php?p=($1)

basierend auf http://httpd.apache.org/docs/1.3/misc/rewriteguide.html

Aber irgendwie scheint mir die Doku da nicht vollständig zu sein und zu 95% aus Beispielen zu bestehen. Ist z.B. das „[R]“ am Ende der Zeile nötig? Muss ich vorher „RewriteEngine on“ angeben?

Ein paar Tipps in die richtige Richtung wären klasse!

Danke,
-Efchen

Hallo,

Ich stelle mir derzeit sowas in der Art vor, dass jemand
http://server/seite.html eingibt und dann die Seite
http://server/page.php?p=seite aufgerufen wird.

Bleibt dann eigentlich die eingegebene URL in der Adresszeile
stehen, oder wird da die geänderte URL stehen?

Das kannst du machen wie du willst.
Per defaults sind rewrites „intern“, d.h. die URL bleibt stehen.
Mit dem Flag [R] oder [R=301] wird daraus ein externer Redirect.

Mein Versuch ging in diese Richtung:

RewriteRule ^/(.*).html /page.php?p=($1)

Wenn das in der .htaccess steht, darf die Regex den führenden / nicht enthalten, also

RewriteRule ^(.\*).html$ /page.php?p=$1

(Die Klammern hinten könnten sich als störend erweisen, wenn du sie drinnen lässt).

basierend auf
http://httpd.apache.org/docs/1.3/misc/rewriteguide.html

Hast du denn noch einen Apache 1.3 am laufen?

Aber irgendwie scheint mir die Doku da nicht vollständig zu
sein und zu 95% aus Beispielen zu bestehen. Ist z.B. das „[R]“
am Ende der Zeile nötig?

S.O, R = externe Redirect.
Ist in der Doku zu apache 2.2 jedenfalls beschrieben, suche mal nach [flags].

Muss ich vorher „RewriteEngine on“
angeben?

Ja.

Grüße,
Moritz

grep -i rewriterule \*/.htaccess|wc -l # :wink:
97

Ich stelle mir derzeit sowas in der Art vor, dass jemand
http://server/seite.html eingibt und dann die Seite
http://server/page.php?p=seite aufgerufen wird.

basierend auf
http://httpd.apache.org/docs/1.3/misc/rewriteguide.html

Hast du denn noch einen Apache 1.3 am laufen?

Ja.

Egal, wie ichs anstelle, ich bekomme immer nen 500er.

Aha:
Invalid command ‚RewriteEngine‘, perhaps mis-spelled or defined by a module not included in the server configuration

Muss da in der Serverkonfiguration noch mod_rewrite dazugeladen werden oder sowas…? Mal kramen… :smile:

Stimmt, das Modul sollte man natürlich dazu laden…dann klappts auch mit
dem Rewrite :smile:

Nur…mache ich 2 RewriteRules rein, lädt die Seite endlos.

RewriteEngine on
RewriteRule ^(.*).html$ /page.php?p=$1
RewriteRule ^(.*).php$ /page.php?p=$1

Wenn ich die zweite Zeile auskommentiere (#) funktioniert es astrein, wenn ich was mit „.html“ am Ende der URL eingebe. Hab ichs so in der .htaccess stehen, wie oben gezeigt, und lade eine Seite, die auf „.php“ endet, lädt der Browser sich zu Tode und nichts passiert…

Woran mag das liegen?

Ach ja, besten Dank! :wink:

Nur…mache ich 2 RewriteRules rein, lädt die Seite endlos.

RewriteEngine on
RewriteRule ^(.*).html$ /page.php?p=$1
RewriteRule ^(.*).php$ /page.php?p=$1

Liegt das daran, dass wenn ich irgendwas.php aufrufe, er versucht, page.php?p=irgendwas aufzurufen, das aber wieder aufgrund der selben RewriteRule versucht zu verändern und damit in eine Endlosschleife läuft?

Hallo,

Ja, richtig.
Wenn du alles ausser /page.php rewriten willst, könntest du daraus einen externen Redirect machen:

RewriteEngine on
RewriteRule ^(.\*).php$ /$1.html [R,L]
RewriteRule ^(.\*).html$ /page.php?p=$1

Das redirectet foo.php nach foo.html, und foo.html wird intern als page.php?page=foo benutzt.
Dann darfst du natürlich nie /page.php direkt aufrufen.

Grüße,
Moritz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Nachtrag…
Hallo,

Wenn du alles ausser /page.php rewriten willst

Ungetestet:

RewriteEngine on
RewriteRule ^(.\*).html$ /page.php?p=$1

RewriteCond %{REQUEST\_URI} !^page\.php
RewriteRule ^(.\*)\.php$ /page.php?p=$1

Grüße,
Moritz

Wenn du alles ausser /page.php rewriten willst, könntest du
daraus einen externen Redirect machen:

RewriteEngine on
RewriteRule ^(.*).php$ /$1.html [R,L]
RewriteRule ^(.*).html$ /page.php?p=$1

Das redirectet foo.php nach foo.html, und foo.html wird intern
als page.php?page=foo benutzt.
Dann darfst du natürlich nie /page.php direkt aufrufen.

Dann hört es sich aber sicherer an, wenn ich „page.php“ umbenenne in sowas wie „page.xyz“ und schaue, dass „.xyz“ auch PHP-geparsed wird.