PHP mod_rewrite und php

pneuma

Cadet 1st Year
Registriert
Juni 2009
Beiträge
13
Hallo,

da hier gerne geholfen komme ich euch natürlich auf euch zurück ;)

Also ich versuche grade mein Forum .html konform zu machen, sprich alle .php zu .html über mod_rewrite - in diesem sinne - umzuwandeln.

Jetzt hänge ich an einer Datei, wo ich mir seit fast 2 Stunden die Ideen ausgehen und ich mir auch den Kopf zerbreche.

Mein Eintrag für die .htaccess Datei wäre wie folgt:

Code:
RewriteRule ^(.*)\.t([0-9]+).p([0-9]+).html$ thread.php?threadid=$2&page=$5

Die umzuwandelnde URL lautet:

HTML:
 ... <a href="thread.php?threadid=$threads[threadid]<if($search[searchstring])><then>&amp;hilight=$search[searchstring]</then></if><if($search[searchuserid])><then>&amp;hilightuser=$search[searchuserid]</then></if>&amp;page=$xpages{$SID_ARG_2ND}">{$lang->items['LANG_BOARD_LASTPAGE']}</a>

Da die If-Abfragen vorerst nicht benutzt werden, sondern erst in der Suche, habe ich diese spontan ausgelassen.

Meine Veränderung bezüglich des mod_rewrites eintrages:

Code:
 ... <a href="{$threads['topic']}.t$threads[threadid]<if($search[searchstring])><then>&amp;hilight=$search[searchstring]</then></if><if($search[searchuserid])><then>&amp;hilightuser=$search[searchuserid]</then></if>.p{$xpages}.html">{$lang->items['LANG_BOARD_LASTPAGE']}</a>

Normalerweise müsste das so laufen, aber es kommt immer nur die einfach Fehlermeldung:

Sie haben einen ungültigen Verweis angegeben. Wenn Sie einem korrekten Link gefolgt sind, sollten Sie den Administrator benachrichtigen.

Bei allen anderen funktioniert mod_rewrite soweit, nur bei der zickt es ein wenig. Daher habe ich in zuständige .php Datei geschaut und habe auch etwas zu der $xpages gefunden.

PHP:
		if ($threads['replycount'] + 1 > $postsperpage && $showmultipages != 0) {
			$multipage = '';
			$multipages_lastpage = '';
			$xpages = ceil(($threads['replycount'] + 1) / $postsperpage);
			if ($xpages > $showmultipages) {
				eval("\$multipages_lastpage = \"".$tpl->get("board_threadbit_multipages_lastpage")."\";");
				$xpages = $showmultipages;
			}
			for ($i = 1; $i <= $xpages; $i++) {
				$multipage .= ' '.makehreftag("thread.php?threadid=".$threads['threadid']."&amp;page=".$i.$SID_ARG_2ND, $i);
			}
			eval("\$multipages = \"".$tpl->get("board_threadbit_multipages")."\";");
		}
		
		if ($threads['attachments']) $LANG_BOARD_ATTACHMENTS = $lang->get("LANG_BOARD_ATTACHMENTS", array('$attachments' => $threads['attachments']));
	}

Ich habe mir gedacht, dann ändere ich halt die .makehreftag da es den anscheinend hat, das für die href Abfrage notwendig ist. Tja, so weit geht mein wissen und ich habe natürlich ein wenig rumgebastelt, dabei kamen nur viele Fehlermeldungen bei raus.
Wie z.B.

unexpected T_CONSTANT_ENCAPSED_STRING usw.

z.B. habe ich .makehreftag so geändert:

PHP:
				$multipage .= ' '.makehreftag($threads['topic']".t".$threads['threadid'].".p".$i.$SID_ARG_2ND, $i);

PHP:
				$multipage .= ' '.makehreftag("".$threads['topic'].".t".$threads['threadid'].".p".$i.$SID_ARG_2ND, $i);

Meine Frage liegt jetzt darin, wo mein Fehler ist und wie man das nun hinbekommt, das dass trotz allem das richtige ausgibt und nicht nur eine einzelne Meldung das der Verweis ungültig sei.

Danke.
 
Nur ein paar Dinge, die mir beim Draufschauen auf den Regex eingefallen sind:
- Normalerweise sind die ja standardmäßig greedy, müßte also am Anfang nicht ^(.*?) stehen? Sonst würde der ja sofort die ganze Eingabe matchen.
- Die Punkte vor "p" und "html" müßten auch escapet werden.
- "threadid=$2&page=$5" - wie kommst du auf die 5?
 
Vielen Dank für die Antwort.

Die Angaben in der .htaccess sind korrekt, auch mit den ^(.*)

t, p und html escapen, wie ist das gemeint? Also Backslash einfügen?

Auf die 5 kam ich, da erst ab 5 Seiten, die $xpages angezeigt wird - sonst erscheint normal eine Seitenliste.

z.B. 1, 2, 3, 4 ... letzte Seite
 
Genau, vor die Punkte einen Backslash, weil der Punkt ja sonst als "beliebiges Zeichen" interpretiert wird.

$5 steht in diesem Kontext für den fünften geklammerten Teilausdruck, den es gar nicht gibt - du willst $3.
 
PHP:
makehreftag("thread.php?threadid=".$threads['threadid']."&amp;page=".$i.$SID_ARG_2ND, $i);

PHP:
makehreftag(.$threads['topic'].\".t\".$threads['threadid'].\".p\".$i.$SID_ARG_2ND, $i);

PHP:
makehreftag(".$threads['topic'].\".t\".$threads['threadid'].\".p\".$i.$SID_ARG_2ND, $i);

PHP:
makehreftag($threads['topic'].\".t\".$threads['threadid'].\".p\".$i.$SID_ARG_2ND, $i);
Parse error: syntax error, unexpected '"', expecting T_STRING in /users/curtive/www/wbb2/board.php on line 332

PHP:
makehreftag($threads['topic']\".t\".$threads['threadid'].\".p\".$i.$SID_ARG_2ND, $i);
Parse error: syntax error, unexpected T_NS_SEPARATOR in /users/curtive/www/wbb2/board.php on line 332

Funktionieren leider alle vier nicht, egal was ich davor stehen oder noch verändere, es kommen lauter Fehlermeldungen.

Danke, wusste ich gar nicht, dachte der wert hinter dem $ sagt die Anfangsnummer aus.
 
Ähm, wieso haste da denn auch die " (Anführungszeichen) escaped? Mit deinem Beispiel würdest du ja alles irgendwie als Variablen behandeln und nicht als "Text". Wenn du wirklich ein " mit reinnehmen möchtest, was von PHP als String interpretiert wird, dann muss so irgendwie ausschauen: "\"" oder '"'
So wie ich das aber bei dir sehe, brauchste die " nicht als Stringzeichendingens, sondern einfach als Steuerzeichen.
PHP:
makehreftag($threads['topic'].".t".$threads['threadid'].".p".$i.$SID_ARG_2ND, $i);
So dürfte es zumindest kein Syntaxerror mehr beim letzten Ding geben. (Bei den davorigen müsstest du es analog machen).
 
Ich habe das mal so übernommen und leider gibt er immer noch ungültiger Seitenverweis aus, auch wenn die $SID_ARG_2ND mit ".html" ersetze. (In den Links habe ich ebenfalls SID entfernt).

Habe es hinbekommen, fehler lag da drin, das es zweimal .p gab und ahinter war halt ^(.*) dadurch wurde dann immer ein ungültiger Link zugewiesen, habe dann einfach die .p zu .seite umgenannt und es klappt.

Vielen Dank.
 
Zuletzt bearbeitet:
Zurück
Oben