• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Mod Rewrite - Ende einer Zeichenkette / URL

godlike

Warp drölf
Veteran

Registriert
13 Juli 2013
Beiträge
14.332
Ort
Topkekistan
Ja, ich frage mich gerade wie das geht:


[src=text]RewriteRule ^(.*)/(.*)/(.*)\.htm$ /seite.php?var1=$1&var2=$2&var3=$3[L][/src]

und das nicht:

[src=text]RewriteRule ^(.*)/(.*)/(.*)$ /seite.php?var1=$1&var2=$2&var3=$3 [L][/src]

Wie muss ich da was ändern um an Ende einfach sowas wie www.domain.de/var1/var2/var3 zu bekommen?

Folgendes geht ja auch:

[src=text]RewriteRule ^(.*)/(.*)/var3$ /seite.php?var1=$1&var2=$2[L][/src]

Jemand eine Idee?
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.772
Ort
in der Zukunft
servus Godlike, auf anhieb sehe ich das gerade auch nicht, vor allem weil ich nicht genau weiß von welchem Quell-String du ausgehst.
meine Lieblings-Seite zu dem Thema ist aber diese:

http://www.regexr.com/

evtl. hilft die dir ja.

ps: gibt da noch so eine ausgelaufene Abstimmung offiziell zu Beenden ;)
 

Shodan

runs on biochips

Registriert
14 Juli 2013
Beiträge
661
Ort
Citadel Station
Ich habe mir
[src=apache]RewriteRule ^(.*)/(.*)/(.*)$ /seite.php?var1=$1&var2=$2&var3=$3 [L][/src]
mal kurz in eine .htaccess kopiert, eine seite.php geschrieben, die nur var_dump($_GET); macht und "localhost/var1/var2/var3" aufgerufen:

[src=php]array(3) { ["var1"]=> string(4) "var1" ["var2"]=> string(4) "var2" ["var3"]=> string(4) "var3" } [/src]

-> die Regel funktioniert

Gib uns mal mehr Kontext.


Mir fallen allerdings ein paar andere Sachen ein:

Deine Selektoren sind greedy
/var1/var2/var3/ ergibt
[src=php]array(3) { ["var1"]=> string(9) "var1/var2" ["var2"]=> string(4) "var3" ["var3"]=> string(0) "" }[/src]
Das mag kein Problem sein, wenn es nie unerwartetes Zeug am Ende deiner URLs gibt.
Aber so rein aus Prinzip, für mich sieht es so aus als erwartest in var1 alles zu finden, was vor dem ersten Slash steht.
Aber was du schreibst ist:
- Steck alles in var1 !
- du brauchst einen Slash -> nicht erfüllt. Gib solange Zeichen aus var1 ab, bis du einen Slash hast.
- Gefunden! Alles dahinter in var2
- du brauchst einen Slash -> nicht erfüllt. Gib solange Zeichen aus var2 ab, bis du einen Slash hast.
- da ist kein Slash in var2 -> Backtracking! Gib Zeichen aus var1, bis du einen anderen Slash findest.
- Gefunden! Stopf alles dahinter in var2
- du brauchst (immer noch) einen Slash. Gib solange Zeichen aus var2 ab, bis du einen Slash hast.
- Gefunden! Alles dahinter in var3

Die lazy Variante:
[src=apache]RewriteRule ^(.*?)/(.*?)/(.*)$ /seite.php?var1=$1&var2=$2&var3=$3 [L][/src]
Bedeutung:
- Steck erstmal nichts in var1
- du brauchst einen Slash. Steck solange doch Zeichen in var1, bis du einen Slash siehst
- erstmal nichts in var2 stecken
- du brauchst einen Slash. Steck solange doch Zeichen in var2, bis du einen Slash siehst
- Alles weitere in var3
Der letzte darf ruhig greedy sein, in var3 erwartest du ja den ganzen Rest
Ergebnis ist dann:
[src=php]array(3) { ["var1"]=> string(9) "var1" ["var2"]=> string(4) "var2" ["var3"]=> string(5) "var3/" }[/src]

Slashes machen nur Ärger
Slashes sind zwar super beliebt, weil sie so toll aussehen, aber wehe eines deiner Skripte erzeugt eine URL in der var2 leer ist: abc//123
Apache schreibt dir das einfach auf abc/123 um -> Regel feuert nicht. Schlimmer noch, eine ganz andere Regel feuert vielleicht. Sollte das bei dir passieren können, benutz sowas:
[src=apache]RewriteCond %{REQUEST_URI} ^/(.*?)/(.*?)/(.*)$
RewriteRule ^ /seite.php?var1=%1&var2=%2&var3=%3 [L][/src]
Die REQUEST_URI wird nicht geändert (und enthält den Slash am Anfang!), daher ergibt es erwartungsgemäß:
[src=php]array(3) { ["var1"]=> string(3) "abc" ["var2"]=> string(0) "" ["var3"]=> string(3) "123" }[/src]

Wehe aber var1 ist empty: //xyz/123
Doppelte Slashes am Anfang des Pfades gehen gar nicht.
Insbesondere willst du das nicht als relative URL in einem Link haben, denn ein Klick darauf würde zur Domain xyz führen.
Also: Wenn du URLs erzeugst, var1 darf NIEMALS leer sein.

Slashes mappen gerne Dateipfade
Viel Spaß mit der Datei /css/neu/seite.css ;-) Ich vermute du hast diese Zeile, weil sie so offensichtlich ist, einfach nur nicht gepostet:
[src=apache]RewriteCond %{REQUEST_FILENAME} !-f[/src]

Da du, glaube ich, alles in deinen FrontController leitest und daher keine /ajax/api/index.php haben wirst, auf die du dann mit /ajax/api/ zugreifst, wirst du
[src=apache]RewriteCond %{REQUEST_FILENAME} !-d[/src]
vielleicht eher nicht brauchen.

Pfade mögen keine escapten Slashes (%2F)
Sagen wir var1 soll den Referer (http://referer.de) enthalten
?var1=http%3A%2F%2Freferer.de 200
/http%3A%2F%2Freferer.de 404
Siehe AllowEncodedSlashes-Direktive
Default ist off. Aus Sicherheitsbedenken, für die ich keine Quellen kenne.
 

godlike

Warp drölf
Veteran

Registriert
13 Juli 2013
Beiträge
14.332
Ort
Topkekistan
  • Thread Starter Thread Starter
  • #4
Hey, danke schon mal an euch Zwei :)

http://www.regexr.com/

evtl. hilft die dir ja.
Danke, ich schau mir die Seite mal an.

-> die Regel funktioniert
Kann ich so nicht bestätigen. Ich bekomme mit

[src=text]RewriteRule ^(.*)/(.*)/(.*)$ seite.php?var1=$1&var2=$2&var3=$3 [L][/src]

einen Fehler:

Internal Server Error

gebe ich $var3 explizit an, in meinem Fall ist das ein Sprachkürzel, funktioniert es:

[src=text]RewriteRule ^(.*)/(.*)/en$ seite.php?var1=$1&var2=$2&var3=en [L][/src]

Leider brauche ich somit aber mehrere Aufrufe in der htaccess obwohl physikalisch ja nur eine Datei, nämlich die seite.php, vorhanden ist. Irgendwie eher subobtimal - auch wenn es so funktioniert. Wieso dem so ist, also über die manuell vergebene Variable in der htaccess, kapiere ich nicht.

Deine Anmerkung mit den Variablen, wo ich alles rein stecke, verstehe ich nicht ganz. Das Ziel war es Quasi virtuelle Ordner zu schaffen. $var1 und $var2 kommen dabei aus einer Datenbank. Wird eine andere Variable über die URL eingespeist kommt eine 404 Seite. Ordner haben sich da beim jetzigen Inhalt irgendwie angeboten.

aber wehe eines deiner Skripte erzeugt eine URL in der var2 leer ist
Kann so nicht passieren da dies geprüft wird und im Falle dann eine 404 ausgegeben wird.

Insgesammt handelt es sich um ~ 45000 Seiten. Wäre für die Google-Ergebnisse halt nicht so prall wenn ich das jetzt umstelle. Auch weil viele Kunden eindeutige URLs zum einbinden erhalten haben usw.

Oder habe ich da was falsch verstanden?

Viele Grüße und Danke für die Mühe :)
 

Shodan

runs on biochips

Registriert
14 Juli 2013
Beiträge
661
Ort
Citadel Station
Deine Anmerkung mit den Variablen, wo ich alles rein stecke, verstehe ich nicht ganz.
Ging mir um die Auswertung von Regulären Ausdrücken, insbesondere greedy (.*) und lazy (.*?) und warum ich glaube, dass du letzteres meinst, auch wenn du ersteres nutzt.


"Internal Server Error" <- Und was sagt das error log?
In meiner Testumgebung geht es wie gesagt. Was steht sonst noch so in der Datei? Am wahrscheinlichsten, wenn es mit der erwähnten kleinen Änderung am matching funktioniert, erscheint mir ein loop. Da steht auch wirklich "seite.php" und nicht vielleicht "dev/project/src/seite.php". Aber das ist alles blind geraten, schau erst mal ins error log.


Kann so nicht passieren da dies geprüft wird und im Falle dann eine 404 ausgegeben wird. [...] Oder habe ich da was falsch verstanden?
Nö, wenn du es prüfst, ist ja alles ok. Wollte nur darauf hinweisen, dass das Verhalten des Servers bei leeren Werten nicht trivial ist.
 

godlike

Warp drölf
Veteran

Registriert
13 Juli 2013
Beiträge
14.332
Ort
Topkekistan
  • Thread Starter Thread Starter
  • #6
Leider habe ich keinen Zugriff auf ein error.log da ich nur einen normalen Webspace besitze. Von dem her kann ich hier leider nichts liefern.

Am wahrscheinlichsten, wenn es mit der erwähnten kleinen Änderung am matching funktioniert, erscheint mir ein loop. Da steht auch wirklich "seite.php" und nicht vielleicht "dev/project/src/seite.php".
In der Tat habe ich die Pfade für das Beispiel hier vereinfacht. Dachte nicht das es eine Auswirkung hat - die Pfade in der htaccess stimmen so ja auch.

[src=text]RewriteRule ^(.*)/(.*)/(.*?)$ /seiten/dynamisch/detail.php?var1=$1&var2=$2&var3=$3 [L][/src]

Der Pfad sollte doch passen oder? Habe es auch schon mit RewriteBase / probiert - ohne Unterschied.

Hintergrund dazu ist das die alte Seite für jede Sprache eine eigene PHP-Seite hatte. Da ich diese gerade überarbeite will ich natürlich nur noch EINE Seite haben, also physikalisch, und das andere rein dynamisch erzeugen. Darum die $var3 mit der Sprache. Diese hile ich im Übrigen ganz am Anfang der detail.php per $_GET['lang']. Danach wird eine functions und eine Sprachdatei eingebunden usw. Nichts außergewöhnliches.

Mich wundert es einfach das es klappt wenn ich $var3 explizit angebe, ein Error kommt wenn ich das dynamisch versuche...

Muss mal schauen ob ich das Error Logging bei allinkl irgendwo aktivieren kann.

Viele Grüße

godlike
 

Shodan

runs on biochips

Registriert
14 Juli 2013
Beiträge
661
Ort
Citadel Station
"seiten/dynamisch/detail.php" wird von "^(.*)/(.*)/(.*?)$" erfasst.
Daraus wird dann: "/seiten/dynamisch/detail.php?var1=seiten&var2=dynamisch&var3=detail.php"

Und das wird, welche Überraschung, von "^(.*)/(.*)/(.*?)$" erfasst -> Loop

Setz die Condition [src=apache]RewriteCond %{REQUEST_FILENAME} !-f[/src] davor. Damit wird erkannt, dass "/seiten/dynamisch/detail.php" eine existierende Datei ist, und der Rewrite findet nicht statt.
Das ist, wie schon erwähnt, sowieso eine gute Idee, weil es nicht unwahrscheinlich ist, dass du Dateien wie css, png oder js in einer verschachtelten Ordnerstruktur hast: /img/news/pressemitteilung_140417.png
 
Zuletzt bearbeitet:

godlike

Warp drölf
Veteran

Registriert
13 Juli 2013
Beiträge
14.332
Ort
Topkekistan
  • Thread Starter Thread Starter
  • #8
Oh, ne das wusste ich in der Tat nicht :confused: Ich bin mit dieser Materie leider überhaupt nicht firm. Wie es in der Branche halt so ist habe ich auch keine Zeit mich damit richtig zu beschäftigen. Nach dem Aufruf mit

[src=text]RewriteCond %{REQUEST_FILENAME} !-f[/src]

Fehlten einige Parameter. Um nicht auf der Live-Seite zu testen hab ich dann die detail.php kopiert und wie folgt eingebaut:

[src=text]RewriteRule ^(.*)/(.*)/(.*?)test$ /seiten/dynamisch/detail2.php?var1=$1&var2=$2&var3=$3 [L][/src]

Der Aufruf klappte dann aber auf ein mal. So das ich nicht mal prüfen konnte wieso ohne das test in der RewriteRule eine Variable verloren ging. Hab dann just4fun mal herum probiert und gemerkt das ich auch URLs aufrufen kann die es so gar nicht gib. Und zwar mit korrektem Inhalt. In dem ich nach domain.de einfach willkürliche virtuelle Ordner angebe (unter Voraussetzung das die grund-Variablen stimmen und vorhanden sind.)

So ergibt

http://www.domain.de/var1/var2/var3

das selbe Ergebnis wie z.B.

http://www.domain.de/foo/bar/var1/var2/var3

:confused:

Irgendwie hab ich mich mit dem Thema wohl übernommen. Hätte zufrieden sein sollen wie es anfangs lief...

Gruß godlike

edit: gäbe es denn eine Möglichkeit das Ranking einigermaßen zu erhalten und das Rewrite anders zu gestalten? Mir schwebt sowas vor;

[src=text]RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ /seiten/dynamisch/detail.php?var=$1&var2=$2&var3=$3 [L][/src]

Wobei $var1 dann meine Sprache wäre. Mit einer *.html Seite fahre ich auf lange Sicht ja vielleicht sogar besser... ?
 
Zuletzt bearbeitet:

Shodan

runs on biochips

Registriert
14 Juli 2013
Beiträge
661
Ort
Citadel Station
Nach dem Aufruf mit [src=text]RewriteCond %{REQUEST_FILENAME} !-f[/src]Fehlten einige Parameter.
Da weiß ich so spontan jetzt auch nichts. Hast du deine details2.php mal auf das Minimum reduziert?
[src=php]<?php var_dump($_GET); exit;[/src]
nicht, dass dir die Logik $var3 killt, weil dein Testwert kein gültiger Wert ist ;-)


edit: gäbe es denn eine Möglichkeit das Ranking einigermaßen zu erhalten und das Rewrite anders zu gestalten?
Wie gesagt: "foo/bar/123/abc/xyz" wird zu "/seiten/dynamisch/detail.php?var=foo/bar/123&var2=abc&var3=xyz" weil das (.*) greedy ist und sich so viele Zeichen nimmt, wie es kann.
Warum deine Logik für var1="123" und var1="foo/bar/123" identische Ergebnisse ausgibt, kann ich dir nicht sagen.


Mir schwebt sowas vor;
[src=text]RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ /seiten/dynamisch/detail.php?var=$1&var2=$2&var3=$3 [L][/src]
Keine schlechte Idee, die Regel feuert so nur für Anfragen mit genau zwei Slashes, nicht für solche mit 3 oder mehr. Präzision ist bei Regex immer sinnvoll.

Um nicht auf der Live-Seite zu testen
Wir haben keinen Smilie, der den Terror ausdrücken kann, der diese Aussage bei mir weckt.

PS: muss jetzt mal ernsthaft arbeiten, sehe heute Abend wieder rein ;-)
 

godlike

Warp drölf
Veteran

Registriert
13 Juli 2013
Beiträge
14.332
Ort
Topkekistan
  • Thread Starter Thread Starter
  • #10
Hey Shodan, leider komme ich heute auch zu nichts mehr da ich gleich weg muss und über das Wochenende bis einschließlich Montag auch weg bin. Danach werde ich aber auf jeden Fall weiter probieren und ggf. auch eine [R=301,L] Weiterleitung basteln. Also alles auf *.html umstellen.

Wir haben keinen Smilie, der den Terror ausdrücken kann, der diese Aussage bei mir weckt.
Das ich nicht auf einem Live System teste? Oder wie ist das gemeint? (ja ich weiß worauf du hinaus willst. Dieser hier bietet sich aber doch an -> :mad:) :cool:

Wie gesagt: "foo/bar/123/abc/xyz" wird zu "/seiten/dynamisch/detail.php?var=foo/bar/123&var2=abc&var3=xyz"
Das habe ich verstanden. Darum ja auch der neue Anlauf mit der html-Endung. Wie gesagt war mir das bis dato gar nicht klar. Die Seite hatte ja so funktioniert wie sie war.

Viele Grüße

godlike
 
Oben