# Problem MOD_REWRITE - Highlight



## PhoenixDH (25. Februar 2010)

Hallo zusammen,

ich habe eine SEO Forensoftware.
Leider ist die schon etwas älter und der SEO Mod wird nicht mehr unterstützt, somit bin ich alleine darauf angewiesen mein Problem zu lösen 

Also es geht um folgendes:
Nach dem Einbau des SEO Mods geht das Highlighting in einem Topic nicht mehr.
Jetzt möchte ich das ganze wieder in die mod_rewrite URL mit aufnhehmen.
Das Highlighting ist im QUellcode des FOrums eigentlich noch drin.

Eine URL sieht z.B. so aus:
http://www.xyz.de/xyz-t123.html
Dazu die Regel:

```
RewriteRule ^.+-t([0-9]*).html$ viewtopic.php?t=$1 [L]
```

Das Highlighting soll so aussehen:
http://www.xyz.de/xyz-t123-h-suchwort.html
Wie müsste dann die Regel aussehen?
so:

```
RewriteRule ^.+-t([0-9]*)-h-([a-zA-Z0-9]*).html$ viewtopic.php?t=$1&highlight=$2 [L]
```
Es sollen beliebig viele Zahlen und Buchstaben erlaubt sein für das Suchwort.

Dank euch!


----------



## Sven Mintel (7. März 2010)

Moin,

wie muss die URL denn aussehen, damit das Higlightning funktioniert und wie sieht sie aktuell aus?


----------



## PhoenixDH (7. März 2010)

Also wenn ich die Suche ausführe, dann wird diese URL generiert:

```
viewtopic.php?t=9399&highlight=terrarium
```

Das wird automatisch aber umgeleitet zu

```
hallo-aus-ostfriesland-t9399.html
```

Jetzt habe ich schon im Quellcode einer Forendatei gesucht und dort entsprechende Änderungen gemacht, denn die Forensoftware schreibt im Normallfall URLS in denen highlight vorkommt nicht um, aber wenn ich z.B. den Link von oben nehme und ihn umschreibe nach:

```
xyz-t123-h-suchwort.html
```
kommt immer wieder ne Weiterleitung zu:

```
xyz-t123.html
```
und verschluckt das -h-suchwort.

Hier mal noch die .htaccess:

```
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.xyz\.de$ [NC]
RewriteRule (.*)$ http://www.xyz/Forum/$1 [L,R=301]

# Kategorien
RewriteRule ^.+-c([0-9]+).html$ index.php?c=$1 [L]

# User
RewriteRule ^.+-u([0-9]+).html$ profile.php?mode=viewprofile&u=$1 [L]

# Forum
RewriteRule ^.+-f([0-9]+).html$ viewforum.php?f=$1 [L]
RewriteRule ^.+-f([0-9]+)-s([0-9]+).html$ viewforum.php?f=$1&start=$2 [L]
RewriteRule ^.+-f([0-9]+)-p([0-9]+)-s([0-9]+).html$ viewforum.php?f=$1&topicdays=$2&start=$3 [L]
RewriteRule ^.+-f([0-9]+)-p([0-9]+).html$ viewforum.php?f=$1&topicdays=$2 [L]

#topic
RewriteRule ^.+-t([0-9]*).html$ viewtopic.php?t=$1 [L]
RewriteRule ^.+-t([0-9]*)-h-([a-z]*).html$ viewtopic.php?t=$1&highlight=$2 [L]
RewriteRule ^.+-t([0-9]*)-s([0-9]*).html$ viewtopic.php?t=$1&start=$2 [L]
RewriteRule ^.+-t([0-9]*)desc.html$ viewtopic.php?t=$1&postorder=desc [L]
RewriteRule ^.+-t([0-9]*)-p([0-9]*)-s([0-9]*).html$ viewtopic.php?t=$1&postdays=$2&postorder=asc&start=$3 [L]
RewriteRule ^.+-t([0-9]*)-p([0-9]*)desc-s([0-9]*).html$ viewtopic.php?t=$1&postdays=$2&postorder=desc&start=$3 [L]
RewriteRule ^.+-t([0-9]*)-p([0-9]*)desc.html$ viewtopic.php?t=$1&postdays=$2&postorder=desc [L]

RewriteRule ^.+-t([0-9]*)-p([0-9]*).html$ viewtopic.php?t=$1&postdays=$2&postorder=asc&start=0 [L]
```


----------



## Sven Mintel (7. März 2010)

PhoenixDH hat gesagt.:


> aber wenn ich z.B. den Link von oben nehme und ihn umschreibe nach:
> 
> ```
> xyz-t123-h-suchwort.html
> ```



Wie, womit schreibst du ihn um?
Gibst du ihn direkt so in der Adresszeile des Browsers ein?


----------



## PhoenixDH (7. März 2010)

Ja, zum testen, damit ich nicht gleich den SUchcode anpassen muss.


----------



## Sven Mintel (7. März 2010)

Mmmh,

also wenn dies:


```
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.xyz.de$ [NC]
RewriteRule (.*)$ http://www.xyz/Forum/$1 [L,R=301]

# Kategorien
RewriteRule ^.+-c([0-9]+).html$ index.php?c=$1 [L]

# User
RewriteRule ^.+-u([0-9]+).html$ profile.php?mode=viewprofile&u=$1 [L]

# Forum
RewriteRule ^.+-f([0-9]+).html$ viewforum.php?f=$1 [L]
RewriteRule ^.+-f([0-9]+)-s([0-9]+).html$ viewforum.php?f=$1&start=$2 [L]
RewriteRule ^.+-f([0-9]+)-p([0-9]+)-s([0-9]+).html$ viewforum.php?f=$1&topicdays=$2&start=$3 [L]
RewriteRule ^.+-f([0-9]+)-p([0-9]+).html$ viewforum.php?f=$1&topicdays=$2 [L]

#topic
RewriteRule ^.+-t([0-9]*).html$ viewtopic.php?t=$1 [L]
RewriteRule ^.+-t([0-9]*)-h-([a-z]*).html$ viewtopic.php?t=$1&highlight=$2 [L]
RewriteRule ^.+-t([0-9]*)-s([0-9]*).html$ viewtopic.php?t=$1&start=$2 [L]
RewriteRule ^.+-t([0-9]*)desc.html$ viewtopic.php?t=$1&postorder=desc [L]
RewriteRule ^.+-t([0-9]*)-p([0-9]*)-s([0-9]*).html$ viewtopic.php?t=$1&postdays=$2&postorder=asc&start=$3 [L]
RewriteRule ^.+-t([0-9]*)-p([0-9]*)desc-s([0-9]*).html$ viewtopic.php?t=$1&postdays=$2&postorder=desc&start=$3 [L]
RewriteRule ^.+-t([0-9]*)-p([0-9]*)desc.html$ viewtopic.php?t=$1&postdays=$2&postorder=desc [L]

RewriteRule ^.+-t([0-9]*)-p([0-9]*).html$ viewtopic.php?t=$1&postdays=$2&postorder=asc&start=0 [L]
```

...die richtige und komplette  .htaccess ist, dann kann ich darin nichts finden, was diese ungewollte Umleitung(Umschreibung) erklären würde.


----------



## PhoenixDH (7. März 2010)

Ja, das ist die, ich kann dir ja mal noch den Part aus der PHP schicken:

```
if ( preg_match('#viewtopic.php\?t=#', $url) ) {
		$prg=str_replace("viewtopic.php?","",$url);
		parse_str($prg, $prg_output);
		$highlight = preg_match( '#highlight#', $url) || preg_match( '#vote#', $url) || preg_match( '#newest#', $url);
		if (!$highlight) {
			$sql = "SELECT topic_title
			FROM " . TOPICS_TABLE . "
			WHERE topic_id = '".$prg_output['t']."'";
			if ( !($result = $db->sql_query($sql)) ) {
			message_die(GENERAL_ERROR, 'Could not obtain topic information', '', __LINE__, __FILE__, $sql);
			}
			if ( $row = $db->sql_fetchrow($result) ) {
				$start= preg_match('#start=0#', $url);
				$postdays = preg_match( '#postdays=0#', $url);
				if ($start) {
				$url = str_replace( 'viewtopic.php', '', $url );
				$url = str_replace( 'start=0', '', $url );
				}
				if ($postdays) {
					$url = str_replace( 'viewtopic.php', '', $url );
					$url = str_replace( 'postdays=0', '', $url );
				} else {
					$url = str_replace( 'viewtopic.php', '', $url );
				}
				$url1 = strtr($url,array("?t="=>"-t","&"=>"","amp;"=>"","asc"=>"","start="=>"-s","postdays="=>"-p","postorder="=>""));
				$url = urlencode(strtolower(str_replace($url_search, $url_replace, $row['topic_title'])));
				$url .= $url1. ".html";
			}
		}
	}
```

ALso ich werde da echt net schlau draus. Das oben ist der Originalcode, den ich schon geändert habe zu:

```
if ( preg_match('#viewtopic.php\?t=#', $url) ) {
		$prg=str_replace("viewtopic.php?","",$url);
		parse_str($prg, $prg_output);
		$highlight = preg_match( '#vote#', $url) || preg_match( '#newest#', $url);
		if (!$highlight) {
			$sql = "SELECT topic_title
			FROM " . TOPICS_TABLE . "
			WHERE topic_id = '".$prg_output['t']."'";
			if ( !($result = $db->sql_query($sql)) ) {
			message_die(GENERAL_ERROR, 'Could not obtain topic information', '', __LINE__, __FILE__, $sql);
			}
			if ( $row = $db->sql_fetchrow($result) ) {
				$start= preg_match('#start=0#', $url);
				$postdays = preg_match( '#postdays=0#', $url);
				if ($start) {
				$url = str_replace( 'viewtopic.php', '', $url );
				$url = str_replace( 'start=0', '', $url );
				}
				if ($postdays) {
					$url = str_replace( 'viewtopic.php', '', $url );
					$url = str_replace( 'postdays=0', '', $url );
				} else {
					$url = str_replace( 'viewtopic.php', '', $url );
				}
				$url1 = strtr($url,array("?t="=>"-t","&"=>"","amp;"=>"","asc"=>"","start="=>"-s","postdays="=>"-p","postorder="=>"","highlight"=>"-h-"));
				$url = urlencode(strtolower(str_replace($url_search, $url_replace, $row['topic_title'])));
				$url .= $url1. ".html";
			}
		}
	}
```

Ich müsste mich mal daran setzen in Ruhe die Woche.
Denn das wird bemängelt, bei 3500 Usern und etlichen 10 000 Threads im Board sollte das schon klappen irgendwie.

Edit:
Wenn ich den Code so einbaue, werden die Links in den Suchergebnissen automatisch zu:
http://www.xyz.de/xyz-t123-h-suchwort.html 

ABer wenn ich in den Suchergebnissen dfann auf nen Link klicke komme ich wieder hier raus:
http://www.xyz.de/xyz-t123.html


----------



## PhoenixDH (7. März 2010)

Ich habe hier noch ne Codestelle gefunden:

```
if ($vtopic AND $HTTP_GET_VARS['t']) {

	$keyurl=$page_title;

	$search = array( 'ú','ù', 'Ö', 'Ä', 'Ü', 'ö', 'ä', 'à', 'é', 'è', 'ü', ' ', ".", "'", '#', '&', '/','ß','+','€','§','$','%','?','!',':',';','[',']',',','´','`','*','°','(',')','²','³');

	$replace = array( 'u','u','oe', 'ae', 'ue', 'oe', 'ae', 'a', 'e', 'e', 'ue', '-', "", "", '', '-und-', '-','ss','','euro','','','','','','','','','','','-','-','-','-','-','-','2','3');

	$keyurl=str_replace($search, $replace, "$keyurl");

	$keyurl = strtolower($keyurl);

	$seite = $_SERVER['REQUEST_URI'];

	if (strrpos($seite,'/') > 0)

	$seite = substr($seite, strrpos($seite,'/'));

	$start=$HTTP_GET_VARS['start'];
	$high=$HTTP_GET_VARS['highlight'];

	$tid=$HTTP_GET_VARS['t'];

	if ($seite !="/$keyurl-t$tid.html" and $seite != "/$keyurl-t$tid-s$start.html") {

		header("HTTP/1.1 301 Moved Permanently");

	if (intval($start) > 0)

		header("Location: $keyurl-t$tid-s$start.html");

	else

		header("Location: $keyurl-t$tid.html");
	}


}
```
Kann es auch damit zu tun haben?


----------



## Sven Mintel (7. März 2010)

> Kann es auch damit zu tun haben?



Da würd ich 3 Schnitzel drauf wetten 



> $start=$HTTP_GET_VARS['start'];
> $high=$HTTP_GET_VARS['highlight'];
> 
> $tid=$HTTP_GET_VARS['t'];
> ...




Dieser Code vergleicht den bereinigten Seitentitel mit der angefragten Adresse(rot markiert).
Dieser Vergleich schlägt fehl, weil in der angeforderten Adresse noch das

```
-h-suchwort
```
drinnen ist, was im Seitentitel vermutlich nicht vorkommt.

Du könntest versuchen, vor dem Vergleich aus der Variable $seite per RegExp diesen String zu entfernen.

Alles in allem macht dieses SEO-Module jedoch einen ziemlich verworrenen Eindruck, es scheint sich selbst irgendwie im Kreise zu drehen.


----------



## PhoenixDH (7. März 2010)

Hm, das verstehe ich net ganz!
Könnte ich auch in deiner rot markierten Zeile das -h- mit aufnehmen?

Ja, das ganze System ist schon ein paar Jahre alt, aber greifr zu arg ein das ich das umstellen könnte.
Es gibt auch leider keinen Support mehr dazu, selbst die Entwicklerseite gibt es nicht mehr.

---------------------------

Ich hab mal noch ein bisschen getestet, das hier würde klappen, aber ka ob das Sinn macht:


> $tid=$HTTP_GET_VARS['t'];
> *$high=$HTTP_GET_VARS['highlight'];*
> 
> if ($seite !="/$keyurl-t$tid.html" and $seite != "/$keyurl-t$tid-s$start.html" *and $seite != "/$keyurl-t$tid-h-$high.html"*) {
> ...



Oder kann ich den Part auch ganz löschen?


----------



## Sven Mintel (8. März 2010)

Das sollte hinhauen...allerdings nur, solange der start-Parameter nicht übergeben wird.


----------



## PhoenixDH (8. März 2010)

Hi, klar, diesen Fall müsste ich natürlich noch aufnehmen!
Ich werde auch mal kucken ob ich das nicht ganz rausnehmen kann.

Aber ich glaube das war mal um DC zu vermeiden!

Dank dir für deine Hilfe!

--------

So, hab jetzt alles realisiert.
Eine Frage bleibt noch:
Was benutze ich am besten für die htaccess Regel damit alle Zeichen abgefangen werden?
Im Moment habe ich aus:

```
RewriteRule ^.+-t([0-9]*)-h-([a-z]*).html$ viewtopic.php?t=$1&highlight=$2 [L]
```
das gemacht:

```
RewriteRule ^.+-t([0-9]*)-h-([^.+]*).html$ viewtopic.php?t=$1&highlight=$2 [L]
```

Problem:
Wenn ich mehrere Suchworte habe, dann werden die durch ein *+* verbunden, das ist da scheinbar nicht drin.


----------



## Sven Mintel (8. März 2010)

Versuchs mal mit


```
\S
```
statt dem Punkt.


----------



## PhoenixDH (8. März 2010)

Meinst du so:

```
RewriteRule ^.+-t([0-9]*)-h-([^\S+]*).html$ viewtopic.php?t=$1&highlight=$2 [L]
```

Wenn ja dann geht das auch net, dann werde ich auf die 404 Seite weitergeleitet wie vorher auch.


----------



## Sven Mintel (8. März 2010)

Ahso, nein 

Lass mal das Hütchen davor weg ^

\S findet alle Zeichen, die kein Leerzeichen sind.


```
RewriteRule ^.+-t([0-9]*)-h-(\S+).html$ viewtopic.php?t=$1&highlight=$2 [L]
```


----------



## PhoenixDH (8. März 2010)

Ich werd noch verrückt:
In den Suchergebnissen sieht der Link jetzt so aus wie er soll, was er auch die ganze Zeit tat:
hallo-aus-ostfriesland-t9399-h-terrarium+bauen.html

aber wenn ich auf den Link klicke komm ich hier raus:
hallo-aus-ostfriesland-t9399-h-terrarium bauen.html

Das sollte aber nur an der Regel liegen denk ich, denn am Rest hab ich nix geändert.

Ich hab bald zu viel 

----------------------

Nochmal getestet:
Es ist wirklich nur die htaccess mod_rewrite Regel:
Sobald ich auf die neue umstelle ist das +-Zeichen weg.

Oder ist das ein Zeichen das erst jetzt die Regel richtig greift und ich wieder im Code kramen muss?


----------



## PhoenixDH (9. März 2010)

Da es mir keine Ruhe gelassen hat wieder ein Update:
Ich habe es jetzt hinbekommen. Zwar sind noch ein paar Bugs drin, aber es läuft.
Ich habe z.B. ein Problem mit Umlauten, d.h. wenn ich z.B. nach müde suche wird folgende URKL versucht zu kontaktieren:
suche---hervorhebung-t9334-h-m%FCde.html

Diese Anfrage wird jedoch unendlich weitergeleitet. Als Regel habe ich jetzt:

```
RewriteRule ^.+-t([0-9]*)-h-(\S+).html$ viewtopic.php?t=$1&highlight=$2 [L]
```
Das Problem noch mit der Regel: Anfragen ohne Suchwort wie z.B.
suche---hervorhebung-t9334-h-.html
kommen nicht an.

Wie kann ich das mit den Sonderzeichen lösen?
Im Moment lasse ich einfach ü z.B. durch ü vorher ersetzen, dann klappt die Weiterleitung, aber das Wort wird natürlich nicht gefunden, da es geändert wurde.

Danke!


----------

