Zur Navigation

URLS Suma freundlich gestalten per .htaccess

%20 soll durch _ ersetzt werden + .html

1 Werner (Gast)

Hallo zusammen,

ich hoffe auf Eure Hilfe bei folgendem Problem. Ich möchte gerne die Ausgabe der URLs meiner Seiter von derzeit:

http://meine.domain.de/das%20ist%20die%20url

auf

http://meine.domain.de/das_ist_die_url.html

abändern.

Zum besseren Verständnis möchte ich erklären das der content der Seiten nicht aus einer Datenbank geladen wird, sondern aus verschiedenen Text.txt Dateien. Per PHP wird der Dateiname ausgelesen und für die Erstellung des Menüs verwendet. Die Dateinamen verwenden auch Bindestriche, deshalb könnte es besser sein für die Umschreibung der URLs Unterstriche zu verwenden, oder?

Der Inhalt der Text.txt Dateien wird dann als content geladen und angezeigt.

Könnte man dieses Problem per .htaccess lösen?

MFG
Werner

30.10.2010 20:52

2 Jörg Kruse

Wenn ich dich richtig verstanden habe, möchtest, du, dass bei Aufruf der Seite /das_ist_die_url.html der Inhalt der Textdatei "das ist die url.txt" angezeigt wird?

Du kannst in dem betreffenden PHP-Script mithilfe der Funktion str_replace() die "_" durch " " ersetzen. Allerdings sollten die Namen der Textdateien selbst kein "_" enthalten, da dann auch originäre "_" umgewandelt würden.

30.10.2010 21:04

3 Werner (Gast)

Hallo Jörg,

der Ist-Zusand sieht so aus:

es gibt die Datei "das ist die url.txt"
meine index.php liest den Dateinamen und den Inhalt aus und generiert daraus den Menüeintrag "das ist die url", lädt den content aus der Datei und in der Browserzeile steht http://meine.domain.de/?page=das%20ist%20die%20url.

Das Menü wird aus allen *.txt Dateien innerhalb des Rootverzeichnisses automatisch generiert. Die Verlinkung im Menü ist genau so wie es in der Browserzeile steht.

Ich möchte erreichen, das:

wenn die Datei "das ist die url.txt" ausgelesen wird, der Menüeintrag "das ist die url" (also mit Leerzeichen) generiert wird, der entsprechende content richtig geladen wird und in der Browserzeile soll stehen http://meine.domain.de/das_ist_die_url.html (also das ?page= soll weg, das %20 durch Unterstrich ersetzt wird, und .html soll angefügt werden)

Mit str_replace konnte ich zwar die Ausgabe in der Browserzeile umbauen, die Menülinks aber nicht. Das führte immer dazu, das immer die Startseite geladen wurde, wenn der Dateiname ein Leerzeichen enthielt.

Ich verwende das 10kCMS, ich finde die Idee ganz witzig, es ist hat von 2006 und nicht weiterentwickelt worden. Ich hoffe Du kannst Dir vorstellen was ich erreichen möchte.

VG
Werner

30.10.2010 21:39

4 Jörg Kruse

Das Menü wird aus allen *.txt Dateien innerhalb des Rootverzeichnisses automatisch generiert.

Diese Generierung muss dahingehend bearbeitet werde, dass die " " in "_" geändert werden (also hier gewissermaßen die umgekehrte Umwandlung). Das wäre übrigens auch bei einer Umschreibung mit mod_rewrite in der htaccess (welche hier nicht zweckmäßig ist) notwendig: zum einen müssen Menü- und andere Links auf die suchmaschinenfreundliche Version geändert werden, zum anderen müssen die betreffenden URLs serverintern wieder auf die Original-URL umgeschrieben werden.

30.10.2010 22:05 | geändert: 30.10.2010 22:08

5 Werner (Gast)

<?
/****************************************************************
* 10kCMS - v1.0	- (C) 2006 Ethan Piliavin: Use it as you wish.	*
*      http://www.piliavin.com     				*
*								*
*	 - Some code and ideas were shamelessly 'borrowed' from:*
*		STD Page generation system TM (www.cockos.com)	*
*		STDWiki (C) 2005, Brandon Keely			*
*****************************************************************/

//Load filename from URL
if (isset($_GET['page']) && (file_exists($_GET['page'].'.txt'))) //If the url contains an existing filename
{
	$filename = $_GET['page'].'.txt';  //Load it
}
else
{
	$filename = 'index.txt';  //Otherwise, default to index.txt
	$htmltitle= 'Home';
}

//Load in the file contents
 $fp = fopen($filename,"r");
    if ($fp)
    {   
		//If a title exists, parse it from first line (Start title with ||)
		$firstline = fgets($fp);

		if (substr($firstline, 0, 7) == "[title]")
		{
			$htmltitle = trim(ltrim($firstline, "[title]"));
		}
		else //Otherwise just use the filename
		{	
			rewind($fp); //The first line wasnt a title, so we will need to reread it below as content
		
			$htmltitle = ucfirst(basename($filename, ".txt")); //Use filename as title
			
			//Make sure it doesnt display the ordering info part of the filename
			$ordertest = strstr($htmltitle, '---');
			
			if ($ordertest) //If the order string --- exists in the filename
			{
				$htmltitle = ucwords(substr($ordertest, 3)); //Cut it out and make the rest pretty
			}			
		}
				
		$x = fread($fp, filesize($filename));

		//Setup the search patterns for BBCode-Like Tags
		
            $patterns[0] = '/\[quote\](.+?)\[\/quote\]/is';
            $replacements[0] = '<blockquote>$1</blockquote>';

            $patterns[1] = '/\[sub\](.+?)\[\/sub\]/is';
            $replacements[1] = '<h2>$1</h2>';
            
            $patterns[2] = '/\[u\](.+?)\[\/u\]/is';
            $replacements[2] = '<u>$1</u>';

            $patterns[3] = '/\[b\](.+?)\[\/b\]/is';
            $replacements[3] = '<b>$1</b>';

            $patterns[4] = '/\[i\](.+?)\[\/i\]/is';
            $replacements[4] = '<i>$1</i>';
            
            $patterns[5] = '/\[c\](.+?)\[\/c\]/is';
            $replacements[5] = '<center>$1</center>';
            
            $patterns[6] = '/\[image:([^\]]*)\]/';
            $replacements[6] = '<img src ="$1"></img>';

            $patterns[7] = '/\[mail:([^\]]*)\|([^\]]*)\]/';
            $replacements[7] = '<a href="mailto:$1">$2</a>';

            $patterns[8] = '/\[mail:([^\]]*)\]/';
            $replacements[8] = '<a href="mailto:$1">$1</a>';

            $patterns[9] = '/\[link:([^\]]*)\|([^\]]*)\]/';
            $replacements[9] = '<a href="$1" target="_blank">$2</a>';

            $patterns[10] = '/\[link:([^\]]*)\]/';
            $replacements[10] = '<a href="$1" target="_blank">$1</a>';
            
            ksort($patterns);
            ksort($replacements);
			//Do the replacing
            $x = preg_replace($patterns, $replacements, $x);
            $x = str_replace("[line]", "<hr>", $x);
            $x = str_replace("\n\n", "<p>", $x);
            $x = str_replace("\n", "<br>", $x);
        fclose($fp);  //We are done reading the file!
    }
    
//Begin HTML output
echo "<!Doctype HTML>";
echo "<html><head><meta http-equiv='Content-Type' content='text/html;charset=utf-8'><title>$htmltitle</title>";
echo '<link rel="stylesheet" type="text/css" href="template.css" />';
echo "</head><body>";

//PAGE CONTAINER - OPEN
echo '<div id="container">';

//TOP HEADER
echo '<div id="top"><h1>'.$htmltitle.'</h1></div>';

//NAVIGATION SECTION
echo '<div id="nav">';
    //Loop and output menulinks as unordered list
    echo '<p> <ul id="navlinks">';

    foreach (menulinks() as $link)
    {
    	echo '   <li>'.$link.'</li>';
    }
    echo '</ul></p>';
echo "</div>";

//CONTENT SECTION
echo '<div id="content">';

  //Output the actual textfile
  echo "<p>";
  echo $x; 
  echo '</p>';
echo "</div>";

//FOOTER
echo '<div id="footer">';
echo 'Page last updated on '.date("l, dS F, Y @ h:ia", filemtime($filename)).'. Generated by <a href="http://www.10kcms.com" alt="Simple 10k Single File CMS">10kCMS.</a>';
echo "</div>";

//PAGE CONTAINER - CLOSE
echo "</div>";

//HIDDEN MESSAGE - FREE ADVERTISING!!
echo "<!-- This page was generated by 10kCMS - www.10kCMS.com --> ";

//End HTML output
echo "</BODY></HTML>";

//Function to extract the links and their order from other textfiles in the same folder
function menulinks()
{
	if (($_GET['page'] == 'index') || (!$_GET['page']))  //If we have loaded the index page
	{
		$pagelinks = array('Home');		//Then add the text 'Home' without any link
	}
	else		//Otherwise we must be on a different page
	{
		$pagelinks = array('<a href="'.$PHP_SELF.'?page=index">Home</a>');	//so we must always include the Home link
	}
	
	$files = glob("*.txt"); //Load all the text filenames in this folder
	sort($files);	//Alphebetize the names
	
	
	//Process the filenames (remove ordering info and generate the text and url in an array
	 foreach ($files as $file)
     {
			if (($file != "index.txt") && ($file != "robots.txt")) //Already took care of index, and exclude search engine file from menu
			{
				$file = basename($file, ".txt"); //Remove the .txt from the filenames
        
				// Remove the ordering info from filenames for menu text display
				$ordertest = strstr($file, '---');  //Find location of --- in the filename
				if ($ordertest) //If --- exists in the filename
				{
					$displayfile = substr($ordertest, 3); // we need to remove it
				} 
				else 	//Otherwise there must be no ordering information
				{
					$displayfile = $file;  //So the filename can be used as is
				}
			
				if ( $_GET['page'] == $file ) //If this file is the page that we loaded
				{
					array_push($pagelinks, $displayfile); // then only send text, no link
				}
				else
				{
					array_push($pagelinks, '<a href="'.$PHP_SELF.'?page='.$file.'">'.$displayfile.'</a>'); //Otherwise send text and link
				}
			}
	}
	return $pagelinks;	
}

?>

Das ist der code der Index.php

Ich hatte bisher nur die Zeile
array_push($pagelinks, '<a href="'.$PHP_SELF.'?page='.$file.'">'.$displayfile.'</a>'); //Otherwise send text and link
in
array_push($pagelinks, '<a href="'.$PHP_SELF.'?page='.str_replace(' ','_',$file).'">'.$displayfile.'</a>'); //Otherwise send text and link
geändert, dann wurden aber nur noch die Seiten geladen, bei der die txt Datei kein Leerzeichen enthielt.

Was müßte Deiner Meinung nach geändert werden das es funktioniert?

VG
Werner

30.10.2010 22:13

6 Jörg Kruse

Die Links hast du dann ja schon geändert.

Interessant ist noch der Abschnitt, in welchem der GET-Parameter mit den "_" ausgewertet wird:

//Load filename from URL
if (isset($_GET['page']) && (file_exists($_GET['page'].'.txt'))) //If the url contains an existing filename
{
	$filename = $_GET['page'].'.txt';  //Load it
}
else
{
	$filename = 'index.txt';  //Otherwise, default to index.txt
	$htmltitle= 'Home';
}

Den würde ich folgendermaßen abändern:

//Load filename from URL
$page = '';
if (isset($_GET['page']) {
    $page = str_replace('_',' ',$GET['page']);
}
if ($page && file_exists($page.'.txt')) { //If the url contains an existing filename
    $filename = $page.'.txt';  //Load it
} else {
    $filename = 'index.txt';  //Otherwise, default to index.txt
    $htmltitle= 'Home';
}

30.10.2010 22:33 | geändert: 30.10.2010 22:33

7 Werner (Gast)

Hi Jörg,

ich habe den Teil ausgetauscht, das führt aber zu einem Fehler:

Parse error: syntax error, unexpected '{' in /users/domain/www/index.php on line 13

nehme ich die geschweifte Klammer weg, dann kommt folgender Fehler:

Parse error: syntax error, unexpected T_VARIABLE in /users/domain/www/index.php on line 14

hast Du noch eine Idee?

Werner

30.10.2010 22:52

8 Jörg Kruse

Hier fehlt noch eine Klammer:

if (isset($_GET['page'])) {

30.10.2010 22:56

9 Werner (Gast)

boah geil, es funktioniert !

Eine Kleinigkeit ist jetzt aber anders, der Menüeintrag für die jeweils aktuelle Seite ist aktiv, das war vorher je nach Seite nur Text ohne Link, so konnte der Nutzer immer sehen wo er sich gerade befindet, hättest Du dafür evtl. auch noch eine Idee

Werner

30.10.2010 23:10

10 Jörg Kruse

Dazu würde ich dieses $_GET['page'] auch durch das oben erzeugte $page ersetzen:

if ( $_GET['page'] == $file ) //If this file is the page that we loaded

30.10.2010 23:17