PHP Seitenumstellung, Wechsel auf ohne "?page=..."

[BC]grmbl

Cadet 4th Year
Registriert
Mai 2006
Beiträge
111
Hallo,

ich lasse mittels
Code:
		<?php
			if(isset($_GET['page'])) {
				if (strpos($_GET['page'], '://') !== FALSE || strpos($_GET['page'], '../') !== FALSE) {
					die('Vergiss es!');
				}
				if(file_exists("".$_GET['page']."")) {
					include("".$_GET['page']."");
				}
				else {
					include("home/xyz.php");
				}
			}
			else {
				include("home/xyz.php");
			}
		?>

(Im Content-Bereich eingebunden.)
die Inhalte meiner Homepage auf z.b. index.php einbinden. Die URL im Browser sieht dementsprechend so aus: http://www.domain.de/index.php?page=home/xyz.php
Die Menüunterpunkte lasse ich so highlighten:
Code:
<?php

$navlist_class = array_fill(1, 2, 'untermenue');

switch ($_GET['page']) {
    case 'home/xyz.php':
        $navlist_class[1] = 'untermenue-aktiv';
        break;
    case 'home/zyx.php':
        $navlist_class[2] = 'untermenue-aktiv';
        break;
}
?>

(Über der doctype-Vereinbarung 1. Zeile eingebunden.)

Nun ist die Seite gewachsen und um jeder Seite mit individuellen <title>- und <meta>-Angaben zu versehen, bediene ich mich noch anderer Scripte, z.b. für den <title>:
Code:
<title>Domainblabla - <?php
			if (isset($_GET['page']))
			{
				switch($_GET['page'])
				{
					case 'home/xyz.php': echo 'Startseite';
					break;
					case 'home/zyx.php': echo 'Alphabet';
					break;
					default: echo ''; 
				}
			}
			else
			{
				echo '';
			}
		?></title>
Es ist mittlerweile mehr aufwand, die einzelnen Scripte zu füllen und zu pflegen, so dass ich gerne oder ?page=... auskommen und wieder "normale" URLs wie www.domain.de/xyz.php einsetzen möchte. Dementsprechend will ich nicht mehr den Content includieren, sondern dass Menü. Nun habe ich allerdings das Problem, dass ich die einzelnen Menüpunkte nicht mehr gehighlightet bekommen, da ich bei www.domain.de/xyz.php das xyz.php nicht "ausgelesen" und verwendet bekomme.

Kann mir dabei jemand helfen? Ich hoffe, meine Erklärung kann man irgendwie nachvollziehen.

MfG
 
Probiers mit einer fallweisen Überprüfung der aufgerufenen URL im menue.php, welches du in den einzelnen Seiten includierst.

Hier ein einfaches Fallbeispiel, welches ich nutze um php-skripte, die lediglich zum einfügen in andere PHPs gedacht sind, vor direktem Aufruf schütze.

Code:
  // Check, if this script gets called directly
	if(strpos(strtolower($_SERVER['SCRIPT_NAME']), 'lib-importantfunctions.php') != FALSE) {
		exit("unauthorized Access detected, launching defence systems!");
	}
 
Ich würde schon bei der Content-Include-Methode bleiben.
Änderst du etwas an der Struktur und fügst bspw einen Footer oder so ein, so musst du das dann auf jeder Unterseite ändern.
Aus diesem Grund hat man nur eine Php-Datei die immer aufgerufen wird und den Content includet.

Für Sachen wie Title, Desc, usw würde ich eine config.php anlegen, welche ein Array mit den Titeln hat:

Code:
$titles = array(
  'home' => 'Titel der Homeseite',
  'Konktakt' => 'Titel der Kontaktseite
);

Dann musst du in der index nur noch
Code:
<title><?=$titles[$_GET['page']]?></title>
aufrufen.

Genauso kannst du es dann auch mit den anderen Meta-Angaben machen, sogar mit verschachteltem Array
Code:
$metas = array(
  'home' => array(
    'title' => 'Titel der Homeseite',
    'desc' => 'Beschreibung der Homeseite'
  ),
  'Konktakt' => array(
     'title' => 'Titel der Kontaktseite',
     'desc' => 'Beschreibung der Kontaktseite'
  )
);

echo $metas[$_GET['page']]['title'];

So dürfte das am Ende wesentlich sauberer und aufgeräumter sein.
 
Zuletzt bearbeitet:
WhiteShark schrieb:
Ich würde schon bei der Content-Include-Methode bleiben.
Änderst du etwas an der Struktur und fügst bspw einen Footer oder so ein, so musst du das dann auf jeder Unterseite ändern.
Aus diesem Grund hat man nur eine Php-Datei die immer aufgerufen wird und den Content includet.
Ich möchte alles wie das "Design", Menü, die Sidebar und den Footer in die jeweilige Seite includen, den Content, <title>, <meta> und andere seitenspezifische Inhalte auf der Seite ablegen. Für mich mit meinen geringen php-Kenntnissen ist die Verwendung von nur einem php-Script wohl am besten. Ich habe zum Beispiel das eine Script einfach so angepasst:
Code:
<?php
 
$navlist_class = array_fill(1, 2, 'untermenue');
 
switch ($_SERVER['REQUEST_URI']) {
case 'home/xyz.php':
$navlist_class[1] = 'untermenue-aktiv';
break;
case 'home/zyx.php':
$navlist_class[2] = 'untermenue-aktiv';
break;
}
?>
Damit erreiche ich alles was ich möchte und kann mir alle restlichen Scripte sparen. Jedoch habe ich überall gelesen, dass $_SERVER['REQUEST_URI'] sehr unsicher ist. Nur deswegen frage ich hier nach. Ich habe aber auch gelesen, dass diese Unsicherheit nur bei Einbindung im HTML-Teil außerhalb des PHP-Scriptes entsteht. Anstatt von REQUEST_URI könnte ich auch PHP_SELF oder SCRIPT_NAME nehmen, oder?

MfG
 
Zuletzt bearbeitet:
Sollte es keinen guten Grund für ein eigenes PHP-"Konstrukt" geben würde ich an deiner Stelle ein CMS nehmen. Die include-Methode ist unsicher und unnötige Arbeit, wenn man mit einem CMS alles auf einen Schlag bekommt, dazu sogar noch ne nette Adminoberfläche.
 
Klar könntest du das. Aber wie gesagt macht es nie Sinn sich zig Php-Dateien anzulegen die alle die gleichen Dateien includen.
Ist unsauber und sehr nervig wenn man etwas ändern muss.
 
WhiteShark schrieb:
Code:
$metas = array(
  'home' => array(
    'title' => 'Titel der Homeseite',
    'desc' => 'Beschreibung der Homeseite'
  ),
  'Konktakt' => array(
     'title' => 'Titel der Kontaktseite',
     'desc' => 'Beschreibung der Kontaktseite'
  )
);

echo $metas[$_GET['page']]['title'];
Nach einiger Überlegung werde ich wohl doch zum Array greifen, es bietet sich einfach mehr an und ich habe doch weniger Aufwand.
Die Array-Vereinbarung setze ich auch über die doctype-Vereinbarung, oder?

MfG
 
Mein Vorschlag wär auch: Schmeiß das Konstrukt weg, nutz eines der ordentlichen Open Source CMS, z.B. Contao, Joomla oder Drupal.
- sicherer als die meisten selbst geschriebenen Scripte
- stabiler
- flexibler
- signifikant einfacher zu verwalten und erweitern
- deutlich effektiver hinsichtlich SEO


Wenn es unbedingt eine Eigenbaulösung sein soll, dann trenn wenigstens Code und Ausgabe. Schreib dir eine eigene Template-Engine oder verwende eine freie Lösung.
Was deine <title> und <meta> angeht: Verwende eine Datenbank. Schreib dir in einer DB zu jeder Page, welche content-php sie includen soll, wie die Meta-Tags aussehen, welcher Titel genutzt wird, welcher Navigationspunkt aktiv ist...

Ach ja, und damit du nicht immer index.php?page=... hast rate ich dir, dich mit .htaccess mod_rewrite zu befassen. Dann kommt statt index.php?page?=home/news.php in der Adresszeile hübsch home/news.html raus.
 
Zurück
Oben