Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] mod rewrite von domain.de/category zu domain.de/index.php?cat=category
einermeiner 26-10-2009, 18:53 Hi Leute,
ich will mit .htaccess und mod rewrite meine urls umändern.
Mit
RewriteEngine on
RewriteRule ^(.*).html$ index.php?cat=$1
kann ich von domain.de/category.html nach domain.de/index.php?cat=category springen.
Ich würde aber gerne mit domain.de/category nach domain.de/index.php?cat=category springen, also ohne das .html
Mit
RewriteEngine on
RewriteRule ^(.*)$ index.php?cat=$1
funktioniert es leider nicht.
Weiß jemand wie das funktioniert?
Gruß
AmicaNoctis 26-10-2009, 20:10 Hallo,
ich weiß zwar nicht, ob es daran liegt, aber da ist ein Leerzeichen am Anfang der Zeile. Außerdem musst du beachten, dass du nur LF-Zeilenumbrüche benutzt und nicht die Windows-CRLF-Variante.
Gruß,
Amica
einermeiner 26-10-2009, 20:26 An der Leerzeile am Anfang liegt es nicht, aber was sind LF-Zeilenumbrüche oder die Windows-CRLF-Variante?
Woran kann es noch liegen?
Gruß
ich will mit .htaccess und mod rewrite meine urls umändern.Hat ja nichts mit PHP zu tun... *move*
Hat ja nichts mit PHP zu tun... *move*
Wohin? :confused: :confused: :confused:
Peter
AmicaNoctis 26-10-2009, 21:14 Hallo Peter,
passt Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) - PHP script resource (http://www.php-resource.de/forum/fragen-zu-installation-konfiguration-lamp-wamp-co/) nicht am besten?
Gruß,
Amica
passt Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) - PHP script resource (http://www.php-resource.de/forum/fragen-zu-installation-konfiguration-lamp-wamp-co/) nicht am besten?
Ja, und warum hat er es nicht verschoben? Ich glaube, TobiaZ wird alt. :D Und * verschieb *.
Peter
AmicaNoctis 26-10-2009, 21:20 Achsoooo, jetzt hab ich verstanden. Du hast gar nicht wirklich gefragt, wo sie hin soll :goth:
einermeiner 26-10-2009, 21:29 Ähmm sorry, aber zurück zum Thema, hat da jemand ne Lösung für?
Gruß
AmicaNoctis 26-10-2009, 21:32 Hast du einen HEX-Editor oder den Total Commander oder Notepad++ oder Textpad? Damit kannst du dir anzeigen lassen, ob die Zeilenumbrüche im Windows- oder im UNIX-Format drin stehen. Apache mag Windows-Zeilenumbrüche (CRLF = \r\n = 0d 0a) nicht und spielt nur bei UNIX-Zeilenumbrüche (LF = \n = 0a) mit.
einermeiner 26-10-2009, 21:36 Ich nutze PSPad und hab die UNIX Einstellung gefunden, funktioniert aber trotzdem nicht.
Kann es irgendwie daran liegen, dass er das vielleicht als Verzeichnis ansieht wenn ich ihm keine Dateiendung mitgebe? Kann man da irgendwas drehen?
Gruß
AmicaNoctis 26-10-2009, 21:40 Nein, daran kann es nicht liegen. Lädst du bitte mal die Datei als Anhang hoch?
einermeiner 26-10-2009, 22:01 Ok hier die Datei im Anhang.
Musste sie allerdings in .txt umbenennen, da ich sie sonst nicht hätte anhängen können.
Gruß
AmicaNoctis 26-10-2009, 22:06 Ok, die ist korrekt. Dann frag ich jetzt mal nach der Fehlermeldung, die du bekommst (was ich hätte schon viel früher machen sollen): Welche Fehlermeldung bekommst du?
einermeiner 26-10-2009, 22:14 404 not found
Gruß
AmicaNoctis 26-10-2009, 22:17 An der .htaccess liegt es definitiv nicht. Erstell doch mal bitte eine index.php ;)
einermeiner 26-10-2009, 22:46 Ok, also ich habe jetzt eine index.php und die .htaccess
.htaccess
RewriteEngine On
RewriteRule ^(.*)$ index.php?cat=$1
index.php
<?php
echo "index cat: ".$_GET['cat'];
?>
Wenn ich jetzt domain.de/blub aufrufe bekomme ich folgende ausgabe:
index cat: index.php
Das würde heißen, dass die .htaccess an index.php?cat=index.php weiterleitet.
Eigentlich sollte es
index cat: blub
ausgeben.
Woran liegt das?
Gruß
AmicaNoctis 26-10-2009, 23:01 Dann hast du die max-redirects-Direktive (oder so ähnlich) nicht gesetzt, bzw. nicht auf 1, wie bei mir zum Beispiel.
Dann ändere die .htaccess mal auf
RewriteEngine on
RewriteRule !^index\.php - [C]
RewriteRule ^(.*)$ index.php?cat=$1 [L]
einermeiner 26-10-2009, 23:16 Ja wunderbar so funktioniert es, aber was genau ist diese max-redirects-Direktive?
Oder genauer gesagt was bewirkt
RewriteRule !^index\.php - [C]
?
Gruß
AmicaNoctis 27-10-2009, 01:27 Das darfst du jetzt aber selbst mal nachlesen, wenn es dich interessiert. :rtfm:
was genau ist diese max-redirects-Direktive?
mod_rewrite - Apache HTTP Server (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriteoptions)
RewriteRule !^index\.php - [C]
?
mod_rewrite - Apache HTTP Server (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule)
einermeiner 27-10-2009, 11:12 Hab ich natürlich schon, aber ich habs nicht verstanden.
Für mich würde die Zeile bedeuten: "Die nächste Zeile wird nur ausgeführt wenn index.php nicht existiert", aber das is total unlogisch.
Wo liegt da mein Denkfehler?
Und noch was:
Die Variante funktioniert ja einwandfrei, nur tritt jetzt ein neues Problem auf. Wenn ich das auf einer Website versuche, funktionieren keine CSS Styles, JS und Bilder mehr. Also keine über
<link rel="stylesheet" href="/screen.css" type="text/css" />Ich nehme an die werden auch nach index.php?cat=/screen.css weitergeleitet.
Kann ich dem .htaccess mitgeben das er die ganze Weiterleitung bei .jpg, .css und .js auslässt?
Ich hab zwar das Manuel und ein paar Tutorials gelesen, aber irgendwie werde ich aus denen nicht schlau.
Gruß
Mit
RewriteEngine on
RewriteRule ^(.*)$ index.php?cat=$1
funktioniert es leider nicht.
Natürlich nicht - denn dieses Muster trifft auch auf index.php zu, so dass du in einer Endlosschleife landest.
Du könntest bspw. keinen Punkt im Muster erlauben, wenn du diesen nicht brauchst; oder auch per RewriteCond physisch existierende Dateien/Verzeichnisse vom Rewriting ausschliessen.
einermeiner 27-10-2009, 11:29 Natürlich nicht - denn dieses Muster trifft auch auf index.php zu, so dass du in einer Endlosschleife landest.
Das versteh ich nicht. Ich zerteil mal das ganze:
Also mit "RewriteEngine on" schalte ich das Modul an und ermögliche das Rewriting.
Mit "RewriteRule" erstelle ich eine neue Regel.
"^" bedeutet, am Anfang der Url
"(.*)" bedeutet kein oder mehrere Zeihen
Und mit "$" speichere ich das gesuchte in eine variable, in dem fall in $1
und dann leite ich das ganze einfach an index.php?cat=$i um
Wenn jemand domain.de/index.php aufrufen würde, müsste es mir "index cat = index.php" ausgeben.
Ich verstehe nicht wo da eine Endlosschleife entsteht.
Wenn jetzt domain.de/blub eingegeben wird müsste ich "index cat = blub" bekommen.
Mit "RewriteRule !^index\.php - [C]" funktioniert das auch, ich versteh nur nicht warum.
per RewriteCond physisch existierende Dateien/Verzeichnisse vom Rewriting ausschliessen.
Meinst du damit, das ich dann dort alle Dateien ablegen soll, die eingebunden werden, wie z.B. CSS und JS?
Gruß
onemorenerd 27-10-2009, 12:03 Wenn jemand domain.de/index.php aufrufen würde, müsste es mir "index cat = index.php" ausgeben.
Ich verstehe nicht wo da eine Endlosschleife entsteht.
Wenn eine RewriteRule angewendet wird, entsteht dadurch ja eine neue URL. Mit dieser neuen URL beginnt der ganze Rewrite-Prozess von vorn. Weil du mit ^(.*)$ einfach alles matchst, wird immer wieder umgeschrieben, von vorn begonnen, gematcht, umgeschriebene, von vorn begonnen, ...
Meinst du damit, das ich dann dort alle Dateien ablegen soll, die eingebunden werden, wie z.B. CSS und JS?
Sollst du nicht. Lies mod_rewrite - Apache HTTP Server (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond)
einermeiner 27-10-2009, 12:31 Ok also das mit der Endlosschleife habe ich verstanden.
Aber was meinst du mit:
Sollst du nicht. Lies mod_rewrite - Apache HTTP Server (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond)
Ich soll keine Verzeichnisse ausschließen, aber was sonst? Ich hab das bestimmt schon 3 - 4 mal gelesen, aber mir fehlt der Ansatz.
Gruß
AmicaNoctis 27-10-2009, 13:17 Hallo nochmal,
alles, was du nicht "rewriten" willst, gibst du genau so an, wie auch die index.php ausgeschlossen wird:
RewriteEngine on
RewriteRule !^index\.php - [C]
RewriteRule !^style\.css - [C]
RewriteRule !^script\.js - [C]
RewriteRule !^(.+)\.pdf$ - [C]
RewriteRule !^img/ - [C]
RewriteRule !^download/ - [C]
RewriteRule ^(.*)$ index.php?cat=$1 [L]
Gruß,
Amica
einermeiner 27-10-2009, 13:43 Toll da hät ich auch drauf kommen können :) Danke
So funktioniert es wenn ich ein css file so eingebunden habe:
echo "<link rel=\"stylesheet\" href=\"screen.css\" type=\"text/css\" />";
Aber nicht wenn ich es so eingebunden habe:
echo "<link rel=\"stylesheet\" href=\"/screen.css\" type=\"text/css\" />";
Also sobald ich einen Slash / vor die screen.css Datei schreibe funktioniert es nicht mehr. Allerdings soll das auch funktionieren.
So habe ich es schon versucht, hat aber nicht geklappt:
RewriteEngine on
RewriteRule !^screen\.css - [C]
RewriteRule !^/screen\.css - [C]
RewriteRule !^index\.php - [C]
RewriteRule ^(.*)$ index.php?cat=$1 [L]
Gibt es eine Möglichkeit, dass es auch mit dem Slash funktioniert?
Gruß
alles, was du nicht "rewriten" willst, gibst du genau so an, wie auch die index.php ausgeschlossen wird: [...]
Dann muss er ja bei jeder neu erstellten Datei seine Regel anpassen...
AmicaNoctis 27-10-2009, 15:11 Dann muss er ja bei jeder neu erstellten Datei seine Regel anpassen...
Muss er nicht. Das sollte erstens als Beispiel dienen und zweitens hab ich damit ja auch gezeigt, dass man ganze Verzeichnisse (z. B. img, download), Dateitypen (*.pdf) und auch einzelne Dateien ausschließen kann. Was war daran jetzt so furchtbar?
einermeiner 27-10-2009, 15:37 Nene, das passt schon. Ich klammere alle .css, .js und .jpg Dateien aus.
So sieht die .htaccess Datei aus:
RewriteEngine on
RewriteRule !^(.*)\.css - [C]
RewriteRule !^(.*)\.js - [C]
RewriteRule !^(.*)\.jpg - [C]
RewriteRule !^index\.php - [C]
RewriteRule ^(.*)$ index.php?cat=$1 [L]Mein einziges Problem ist nur das das nicht reagiert wenn ich eine .css mit
echo "<link rel=\"stylesheet\" href=\"/screen.css\" type=\"text/css\" />";einbinden will. Sobald ein / davor steht läuft das ganze nicht.
Habt ihr dafür eine Lösung? Ich find einfach keine.
Gruß
AmicaNoctis 27-10-2009, 15:41 Mein einziges Problem ist nur das das nicht reagiert wenn ich eine .css mit
echo "<link rel=\"stylesheet\" href=\"/screen.css\" type=\"text/css\" />";einbinden will. Sobald ein / davor steht läuft das ganze nicht.
Das wundert mich auch etwas. Wie lautet der Pfad der Datei, in der das eingebunden werden soll? Was passiert, wenn du im Browser direkt http://localhost/screen.css aufrufst? Funktioniert es, wenn du die .htaccess testweise mal abschaltest?
Scriptfarm 27-10-2009, 15:53 Sicherlich ist das Apache Modul eine tolle Sache und bei machen Anwendungsgebieten bietet sich auch die URL Manipulation an.
Aber in diesem Fall würde ich lieber drauf verzichten, und mir lieber die Mühe machen und die Links direkt im Script umchreiben.
einermeiner 27-10-2009, 15:55 Wie lautet der Pfad der Datei, in der das eingebunden werden soll?Die liegt direkt im Hauptordner.
Also in http://localhost/testsystem/index.php
Genauso wie die .htaccess und die screen.css
Was passiert, wenn du im Browser direkt http://localhost/screen.css aufrufst?Sie wird mir ganz normal angezeigt.
Funktioniert es, wenn du die .htaccess testweise mal abschaltest?
Ja, aber das bringt mir ja nichts.
Gruß
AmicaNoctis 27-10-2009, 16:00 Die liegt direkt im Hauptordner.
Also in http://localhost/testsystem/index.php
Genauso wie die .htaccess und die screen.css
Das widerspricht sich aber. Wenn sie im Ordner testsystem liegt, kann sie nicht über http://localhost/screen.css ganz normal angezeigt werden. Hast du es mal mit /testsystem/screen.css probiert? Pfade mit / sind nämlich absolut.
einermeiner 27-10-2009, 16:10 Ach du ***** klar, das läuft ja von dem root verzeichnis aus und nicht von dem in der die index.php und .htaccess Datei liegen.
Ok danke, so funktionierts.
Manchmal sieht man den Wald vor lauter Bäumen einfach nicht.
Ok in dem Fall is das glaub alles geklärt.
Nochmals danke für eure Hilfe (und Geduld :) )
Gruß
Wenn eine RewriteRule angewendet wird, entsteht dadurch ja eine neue URL. Mit dieser neuen URL beginnt der ganze Rewrite-Prozess von vorn.
Genauer gesagt: Wenn man das Rewriting verzeichnisbasiert (in .htaccess) definiert.
Wenn die Regeln in der Serverkonfiguration stehen, dann beginnt nach dem Durchlauf aller Regeln kein "neuer Durchgang".
Das hat etwas damit zu tun, zu welchem Zeitpunkt des URL-Mapping-Prozesses das ganze jeweils ausgeführt wird.
(Weshalb man das ganze bei Sachen, wo höchste Performance gefragt ist, auch möglichst in der Serverkonfiguration macht. Bei Shared Hosting allerdings idR. nicht möglich.)
|
|