zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden mod_rewrite und Regex - meine Erzfeinde

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 23.12.2011, 00:38
body.ie {display: grotte}
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 09.01.2011
Beiträge: 841
take_a_7 sorgt für eine eindrucksvolle Atmosphäretake_a_7 sorgt für eine eindrucksvolle Atmosphäre
Standard mod_rewrite und Regex - meine Erzfeinde

Moin,

ich baue grad eine neue Seite und bin inzwischen bei "schönen URLs" angelangt. Die "normalen" Seiten sollen folgendermaßen adressiert werden:
/foo/bar wird zu /pages/foo/bar.php. Dafür steht in meiner .htaccess Folgendes:
Code:
RewriteRule ^/?(([\w_]+/)*[\w_]+)$ /pages/$1.php [L,QSA]
Nächster Schritt: Anfragen ala /foo/bar.php (die also nicht dem Regex oben entsprechen) sollen mit einem Fehler 404 abserviert werden. Hier tritt das Problem auf: Denn es gibt einen Unterordner des Document-Root "files", indem Downloads, CSS, JS, etc. liegen. Diese sollen natürlich trotzdem erreichbar bleiben. Folgender Code scheint mir logisch:
Code:
RewriteCond %{REQUEST_URI} !^/?(files/.*|([\w_]+/)*[\w_]+)$
RewriteCond %{REQUEST_URI} !^/?/force404\.php$
RewriteRule .* /force404.php [L]
RewriteRule ^/?(([\w_]+/)*[\w_]+)$ /pages/$1.php
Dieser liefert aber für eine Anfrage an bspw. /foo keinesfalls /pages/foo.php aus, sondern /force404.php. Warum?

gruß,
take
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 23.12.2011, 05:41
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 745
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Enthält \w nicht den Unterstrich?

Probier es mal so:

Code:
# Wenn Ressource existiert, dann kein Rewriting
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

# Ansonsten
RewriteRule ^/?((?:\w+/)*\w+)$ /pages/$1.php [L,QSA]
Ob das /? notwendig ist, weiß ich gerade nicht.

(?:…) ist ein non-capturing subpattern. Das heißt, es wird nicht zur weiteren Verwendung ($1, $2, …) gespeichert. Ich halte das für sinnvoll, um anzuzeigen, dass gewisse Informationen nicht verarbeitet, sondern nur gruppiert werden.

Geändert von mermshaus (23.12.2011 um 06:19 Uhr)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 23.12.2011, 11:06
body.ie {display: grotte}
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 09.01.2011
Beiträge: 841
take_a_7 sorgt für eine eindrucksvolle Atmosphäretake_a_7 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Enthält \w nicht den Unterstrich?
Laut diesem Artikel nicht.
Zitat:
Zitat von mermshaus Beitrag anzeigen
Probier es mal so:

Code:
# Wenn Ressource existiert, dann kein Rewriting
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

# Ansonsten
RewriteRule ^/?((?:\w+/)*\w+)$ /pages/$1.php [L,QSA]
Funktioniert schon, aber löst ja mein eigentliches Problem nicht: wird /pages/foo.php angefordert, existiert diese Datei ja, soll aber trotzdem nicht ausgeliefert werden, um zu vermeiden das mehrere URLs (/pages/foo.php und /foo) auf die selbe Datei verweisen.
Zitat:
Zitat von mermshaus Beitrag anzeigen
Ob das /? notwendig ist, weiß ich gerade nicht.
Ich meine mal gelesen zu haben, das einige Apache-Versionen die Request-URI mit Slash und einige ohne Slash zur Verfügung stellen.
Zitat:
Zitat von mermshaus Beitrag anzeigen
(?:…) ist ein non-capturing subpattern. Das heißt, es wird nicht zur weiteren Verwendung ($1, $2, …) gespeichert. Ich halte das für sinnvoll, um anzuzeigen, dass gewisse Informationen nicht verarbeitet, sondern nur gruppiert werden.
Weiß ich doch, war ja hier auch nur ein Beispiel

Vielen Dank auf jeden Fall schonmal und gruß,
take
Mit Zitat antworten
  #4 (permalink)  
Alt 23.12.2011, 12:11
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Code:
# Wenn Ressource existiert, dann kein Rewriting
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

RewriteRule [.css|.js|.pdf]$ - [NC,L] # Hier stehen Endungen, die nicht umgeschrieben werden sollen.

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule ^.*$ /force404.php [NC,L]

# Ansonsten
RewriteRule ^/?((?:\w+/_)*\w+)$ /pages/$1.php [L,QSA]
Das müsste theoretisch machen was du gerne hättest. Somit sollte alles was nicht auf dein RegExp passen einfach auf die Fehlerseite weitergeleitet werden.

Ordner solltest du nicht weiterleiten, das spart dir im Zweifelsfall eine Menge Probleme, falls du doch mal einen anlegst.

Ich habe es nicht getestet, also bitte nicht böse sein, wenn es nicht klappt

Ach so, noch etwas: Wenn ich mit mod_rewrite arbeite, dann nutze ich in der Regel eine index.php die die Ausgabe steuert und über die gesamte angefrage URI als einen Parameter an das Skript. Da wird der dann ausgewertet, "unschädlich" gemacht und in ein Array verarbeitet mit diesem ich dann weiterarbeite. Dann schränke ich mich durch die Nutzung von mod_rewrite nicht so ein, wie du das mit dem von mermshaus gezeigten Quellcode machst. Arrays sind in PHP ja beliebig erweiterbar.
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!

Geändert von Praktikant (23.12.2011 um 12:20 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 23.12.2011, 12:25
body.ie {display: grotte}
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 09.01.2011
Beiträge: 841
take_a_7 sorgt für eine eindrucksvolle Atmosphäretake_a_7 sorgt für eine eindrucksvolle Atmosphäre
Standard

Moin,

Zitat:
Zitat von Praktikant Beitrag anzeigen
Das müsste theoretisch machen was du gerne hättest. Somit sollte alles was nicht auf dein RegExp passen einfach auf die Fehlerseite weitergeleitet werden.
Nope.
Code:
[Fri Dec 23 11:13:06 2011] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
Ich bin aber nicht böse
Problem an deinem Code ist (wenn er funktionieren würde): /files/foo.css führt zu einem 404er weils eine Datei ist. Das soll aber nur bei Dateien passieren, die außerhalb von /files/ liegen, also bspw. /pages/foo.php.
Zitat:
Zitat von Praktikant Beitrag anzeigen
Ach so, noch etwas: Wenn ich mit mod_rewrite arbeite, dann nutze ich in der Regel eine index.php die die Ausgabe steuert und über die gesamte angefrage URI als einen Parameter an das Skript. Da wird der dann ausgewertet, "unschädlich" gemacht und in ein Array verarbeitet mit diesem ich dann weiterarbeite. Dann schränke ich mich durch die Nutzung von mod_rewrite nicht so ein, wie du das mit dem von mermshaus gezeigten Quellcode machst.
OK, das erscheint logisch. Aber wenn ich wirklich alles durch den PHP-Interpreter jage, geht das doch tierisch auf die Performance, oder?
Zitat:
Zitat von Praktikant Beitrag anzeigen
Arrays sind in PHP ja beliebig erweiterbar.
Was du mir damit jetzt sagen willst, ist mir nicht klar...

Edit: Was ich eigentlich nur brauche, ist Folgendes:
Alles was nicht mit /files/ anfängt und nicht auf ^/?([\w_]+/)*[\w_]+ zutrifft, soll einen 404-Fehler hervorrufen. Warum folgender Code das nicht tut bleibt mir ein Rätsel:
Code:
RewriteCond %{REQUEST_URI} !^/?files/
RewriteCond %{REQUEST_URI} !^/?([\w_]+/)*[\w_]+$
RewriteCond %{REQUEST_URI} !=/force404.php
RewriteRule .* /force404.php [L]
Trotzdem auch Danke an dich,
gruß,
take

Geändert von take_a_7 (23.12.2011 um 12:29 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 23.12.2011, 12:37
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Zitat:
Zitat von take_a_7 Beitrag anzeigen
Code:
[Fri Dec 23 11:13:06 2011] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
Oh. Aber Endlosschleifen sind doch etwas tolles
Zitat:
Zitat von take_a_7 Beitrag anzeigen
Problem an deinem Code ist (wenn er funktionieren würde): /files/foo.css führt zu einem 404er weils eine Datei ist.
Hatte noch ein paar Änderungen nach dem Beitrag gemacht. Aber das funktioniert dann auch nicht.
Zitat:
Zitat von take_a_7 Beitrag anzeigen
OK, das erscheint logisch. Aber wenn ich wirklich alles durch den PHP-Interpreter jage, geht das doch tierisch auf die Performance, oder?
Ich habe dazu leider keine konkreten Werte. Ein komplizierter Rewrite mit vielen Variablen und optionalen Angaben (was das Gegenstück ist), geht aber sicherlich auch auf die Performance. Die Inhalte prüfen musst du ja so oder so, ob du die URI dann mit mod_rewrite auf Variablen verteilst oder mit PHP (explode()) ist wahrscheinlich egal.
Zitat:
Zitat von take_a_7 Beitrag anzeigen
Was du mir damit jetzt sagen willst, ist mir nicht klar...
In vielen Sprachen muss man die Anzahl der Indizes angeben wenn man ein Array initialisiert. Das muss man in PHP nicht.
Zitat:
Zitat von take_a_7 Beitrag anzeigen
Warum folgender Code das nicht tut bleibt mir ein Rätsel:
Kann er gar nicht. Auf dem Server wird ja bei dem Code entweder nach einem Ordner (URI) oder der Datei force404.php gesucht. Wenn der Ordner nicht existiert, dann gibt es auch einen Error 404.

Somit endet bei deinem Code jede Anfrage in einem Error 404, die Dateien aus /files/ werden gar nicht erst angefragt.
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
  #7 (permalink)  
Alt 23.12.2011, 14:14
body.ie {display: grotte}
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 09.01.2011
Beiträge: 841
take_a_7 sorgt für eine eindrucksvolle Atmosphäretake_a_7 sorgt für eine eindrucksvolle Atmosphäre
Standard

Moin,

Zitat:
Zitat von Praktikant Beitrag anzeigen
Ich habe dazu leider keine konkreten Werte. Ein komplizierter Rewrite mit vielen Variablen und optionalen Angaben (was das Gegenstück ist), geht aber sicherlich auch auf die Performance. Die Inhalte prüfen musst du ja so oder so, ob du die URI dann mit mod_rewrite auf Variablen verteilst oder mit PHP (explode()) ist wahrscheinlich egal.
Was du mir die ganze Zeit mit Arrays sagen willst, erschließt sich mir leider immer noch nicht
Zitat:
Zitat von Praktikant Beitrag anzeigen
Kann er gar nicht. Auf dem Server wird ja bei dem Code entweder nach einem Ordner (URI) oder der Datei force404.php gesucht. Wenn der Ordner nicht existiert, dann gibt es auch einen Error 404.
Entweder ich verstehe dich nicht, oder mod_rewrite... Wieso denn Ordner? Nochmal mein kompletter Code:
Code:
RewriteCond %{REQUEST_URI} !^/?files/
RewriteCond %{REQUEST_URI} !^/?([\w_]+/)*[\w_]+$
RewriteCond %{REQUEST_URI} !=force404.php
RewriteRule .* /force404.php [L]
RewriteRule ^/?((?:\w+/)*\w+)$ /pages/$1.php [L,QSA]
Wenn ich jetzt einen Request auf /foo mache, trifft doch der zweite Regex (RewriteCond %{REQUEST_URI} !^/?([\w_]+/)*[\w_]+$) zu, weil die Bedingung aber negiert wird, sollte die RewriteRule zu /force404.php nicht ausgeführt werden, sondern stattdessen die Nachfolgende. Das passiert aber nicht - es wird /force404.php aufgerufen

gruß,
take
Mit Zitat antworten
  #8 (permalink)  
Alt 23.12.2011, 18:37
Benutzerbild von Praktikant
Semantikbremse.
XHTMLforum-Kenner
 
Registriert seit: 22.04.2008
Beiträge: 4.985
Praktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz seinPraktikant kann auf vieles stolz sein
Standard

Zitat:
Zitat von take_a_7 Beitrag anzeigen
Was du mir die ganze Zeit mit Arrays sagen willst, erschließt sich mir leider immer noch nicht
Also. Wenn du jetzt eine URI hast die so aussieht /das/ist/meine/uri/ und du diese mit mod Rewrite umschreibst auf beispielsweise index.php?p=das&q=ist&x=meine&y=uri, dann bist du darin bescränkt, dass du maximal 4 Parameter angeben kannst.

Wenn du allerdings einfach umschreibst auf index.php?i=das/ist/meine/uri/ und das dann in mithilfe von PHP in ein Array packst, dann hast du am Ende ein Array, das so aussieht
PHP-Code:
$array = (=> 'das'=> 'ist'=> 'meine'=> 'uri'). 
Dieses Array ist das beliebig erweiterbar. Das heißt, wenn du irgendwann mal an die URI noch einen 5. optionalen Parameter anhängen willst, dann musst du das nicht kompliziert in der .htaccess machen, sonst kannst einfach dein Query verarbeiten wie immer und im PHP prüfst du dann an dann an einer Stelle ob dieser optionale 5. Index im Array gesetzt ist. So bist du flexibler.

Zitat:
Zitat von take_a_7 Beitrag anzeigen
Entweder ich verstehe dich nicht, oder mod_rewrite... Wieso denn Ordner? Nochmal mein kompletter Code:
Code:
RewriteCond %{REQUEST_URI} !^/?files/
RewriteCond %{REQUEST_URI} !^/?([\w_]+/)*[\w_]+$
RewriteCond %{REQUEST_URI} !=force404.php
RewriteRule .* /force404.php [L]
RewriteRule ^/?((?:\w+/)*\w+)$ /pages/$1.php [L,QSA]
Dieser Code und der aus deinem vorangegangen Post sind unterschiedlich. Jetzt macht das ganze mehr Sinn.
Zitat:
Zitat von take_a_7 Beitrag anzeigen

Wenn ich jetzt einen Request auf /foo mache, trifft doch der zweite Regex (RewriteCond %{REQUEST_URI} !^/?([\w_]+/)*[\w_]+$) zu, weil die Bedingung aber negiert wird, sollte die RewriteRule zu /force404.php nicht ausgeführt werden, sondern stattdessen die Nachfolgende. Das passiert aber nicht - es wird /force404.php aufgerufen
Die Zweite Condition trifft nicht zu. Daher die erste und die letzte auch nicht zutreffen, wird dann umgeschrieben. Die beiden RegExp (aus der Codition und der Regel) sind auch nicht dieselben. Vielleicht solltest du das auch mal ändern.

Ich arbeite nicht so oft mit .htaccess. Ich nutze es zwar bei fast allen Projekten, allerdings immer dieselbe Regel. Ich brauche sie nur kopieren... Bei meiner Regel treffen allerdings generell alle Zeichen zu und jede Datei ist unter zwei Namen aufrufbar.
__________________
Rettet die Erde.... sie ist der einzige Planet mit Schokolade!
Mit Zitat antworten
  #9 (permalink)  
Alt 23.12.2011, 18:54
body.ie {display: grotte}
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 09.01.2011
Beiträge: 841
take_a_7 sorgt für eine eindrucksvolle Atmosphäretake_a_7 sorgt für eine eindrucksvolle Atmosphäre
Standard

Moin,

Zitat:
Zitat von Praktikant Beitrag anzeigen
Also. Wenn du jetzt eine URI hast die so aussieht /das/ist/meine/uri/ und du diese mit mod Rewrite umschreibst auf beispielsweise index.php?p=das&q=ist&x=meine&y=uri, dann bist du darin bescränkt, dass du maximal 4 Parameter angeben kannst.

Wenn du allerdings einfach umschreibst auf index.php?i=das/ist/meine/uri/ und das dann in mithilfe von PHP in ein Array packst, dann hast du am Ende ein Array, das so aussieht
PHP-Code:
$array = (=> 'das'=> 'ist'=> 'meine'=> 'uri'). 
Dieses Array ist das beliebig erweiterbar. Das heißt, wenn du irgendwann mal an die URI noch einen 5. optionalen Parameter anhängen willst, dann musst du das nicht kompliziert in der .htaccess machen, sonst kannst einfach dein Query verarbeiten wie immer und im PHP prüfst du dann an dann an einer Stelle ob dieser optionale 5. Index im Array gesetzt ist. So bist du flexibler.
Erscheint alles logisch, jetzt weiß ich auch was du meinst. Aber das will ich ja gar nicht Ich habe ja schon für jede Seite eine eigene php-Datei, jetzt will ich praktisch nur URLs ohne Extension (.php) haben und Verhindern, dass die Dateien mit Extension aufgerufen werden.
Zitat:
Zitat von Praktikant Beitrag anzeigen
Die Zweite Condition trifft nicht zu. Daher die erste und die letzte auch nicht zutreffen, wird dann umgeschrieben.
Was? Es wird umgeschrieben wenn eine RewriteCond nicht zutrifft?
Zitat:
Zitat von Praktikant Beitrag anzeigen
Die beiden RegExp (aus der Codition und der Regel) sind auch nicht dieselben. Vielleicht solltest du das auch mal ändern.
Sorry, der aus der RewriteCond ist der Richtige.
Zitat:
Zitat von Praktikant Beitrag anzeigen
Bei meiner Regel treffen allerdings generell alle Zeichen zu und jede Datei ist unter zwei Namen aufrufbar.
Genau das will ich ja nicht...

gruß,
take
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 24.12.2011, 08:45
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von take_a_7 Beitrag anzeigen
Laut diesem Artikel nicht.Funktioniert schon, aber löst ja mein eigentliches Problem nicht:
PHP-Code:
var_dumppreg_match'#\w#''_' ) );
# int (1) 
__________________
github | http://dnaber.de
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
RegEx für Link-Wiederholungen BNightSpeeder Serveradministration und serverseitige Scripte 4 10.05.2010 14:00
Regex Problem ("]" killt die regex) psycho_dmr Serveradministration und serverseitige Scripte 7 29.04.2007 17:49
hier eine leichte: regex über seite bauen bernard_hinault CSS 13 01.09.2006 21:33
RegEx (PCRE): Schließende Tags ergänzen? Ulti Serveradministration und serverseitige Scripte 4 09.05.2006 21:01
regex, zeichenkette auf \w reduzieren.. psycho_dmr Serveradministration und serverseitige Scripte 5 19.02.2006 04:08


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:30 Uhr.