[PHP] Template System + SEO-URLs funktioniert nicht korrekt

dstN

Més que un Club!
Registriert
19 Nov. 2013
Beiträge
89
Ort
/dropbox/
Hallo,

ich habe hier folgendes System, dass es mir ermöglicht für einzelne Bereiche der index.php andere Inhalte einblenden zu lassen:

[src=php]class Controller {
var $name;
var $dir;
function __construct($name, $dir = 'src') {
$this->name = $name;
$this->dir = $dir;
if(isset($_GET['page'])) {
if(file_exists($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php')) {
require($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php');
}
else {
require($this->dir.'/'.$this->name.'.php');
}
}
else {
require($this->dir.'/'.$this->name.'.php');
}
}
}[/src]

Aufgerufen wird dann im Template folgendermaßen:

[src=php]<?php $content = new Controller('content'); ?>[/src]

Die Datei die dann eingefügt wird, heiß dann seitenname_content.php

Folgendes funktioniert: Aufruf der Seiten via href="index.php?page=seitenname"

Ich wollte aber, dass statt dem href einfach nur der Seitenname dasteht also: href="seitenname"

Dazu folgende .htaccess:
[src=apache]RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_URI} !^/+(admin|images)/?
RewriteCond %{REQUEST_URI} !(\..{2,4})$
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L][/src]

Das funktioniert nur leider nicht. Aufruf der "index.php" erfolgt immer in ein 404-Fehler und der Aufruf anderer Seiten funktioniert zwar, aber es wird immer der Inhalt der standard content.php geladen, statt der seitenname_content.php.

Ich dachte erst, dass es an 1und1 liegt, weshalb ich extra eine Subdomain angelegt habe, die direkt in das Verzeichnis routet, in der mein Projekt liegt.. doch auch damit funktioniert es nicht. Weiß jemand Rat?
 
Ist die RewriteBase korrekt? Lasse dir ggf. einmal $_GET['page'] in deinem PHP-Skript ausgeben und stelle sicher, dass der Seitenname beim Aufruf über die Rewrite-Regel enthalten ist. Abgesehen davon würde sich statt
[src=apache]RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L][/src]
anbieten, zur Erhaltung des Query-Strings die in mod_rewrite in Form des [QSA]-Flags enthaltene Funktionalität zu nutzen:
[src=apache]RewriteRule ^.*$ index.php?page=$0 [QSA,L][/src]

Beachte auch, dass du über
[src=php] if(file_exists($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php')) {
require($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php');
}[/src]
eine kritische Local-File-Inclusion-Schwachstelle aufreisst, so wäre es z.B. möglich, über einen GET-Parameter der Form`page=../../../../../etc/passwd%00` beliebige Dateien auf deinem Server auszulesen und als PHP-Code verarbeiten zu lassen. Du solltest zumindest sicherstellen, dass $_GET['page'] ausschliesslich alphanumerische Zeichen enthält.
 
  • Thread Starter Thread Starter
  • #3
Ist die RewriteBase korrekt? Lasse dir ggf. einmal $_GET['page'] in deinem PHP-Skript ausgeben und stelle sicher, dass der Seitenname beim Aufruf über die Rewrite-Regel enthalten ist.

echo von $_GET['page'] ist "kunden/kunde/seitenname" - Projekt liegt auf meinem Server unter domain.de/kunden/kunde - und obwohl die Subdomain kunde.domain.de genau in das Verzeichnis reinroutet, entstehen hinter der Subdomain die Links "/kunden/kunde/seitenname" - was für mich persönlich keinen Sinn macht, aber es passiert. Das System scheint also eigentlich zu funktionieren, nur lädt er nicht den korrekten Content des jeweiligen Seitennamen.

//Edit: Wenn ich die ReWriteBase auf "/kunden/kunde" ändere, kriege ich 404er.

Abgesehen davon würde sich statt
[src=apache]RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)$ index.php?page=$1&%1 [L][/src]
anbieten, zur Erhaltung des Query-Strings die in mod_rewrite in Form des [QSA]-Flags enthaltene Funktionalität zu nutzen:
[src=apache]RewriteRule ^.*$ index.php?page=$0 [QSA,L][/src]

Danke, habe ich mich mal so übernommen.

Beachte auch, dass du über
[src=php] if(file_exists($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php')) {
require($this->dir.'/'.$_GET['page'].'_'.$this->name.'.php');
}[/src]
eine kritische Local-File-Inclusion-Schwachstelle aufreisst, so wäre es z.B. möglich, über einen GET-Parameter der Form`page=../../../../../etc/passwd%00` beliebige Dateien auf deinem Server auszulesen und als PHP-Code verarbeiten zu lassen. Du solltest zumindest sicherstellen, dass $_GET['page'] ausschliesslich alphanumerische Zeichen enthält.

Wie kann ich denn einen alphanumerischen Filter hinzufügen? Bin noch relativ am "Anfang" meiner php-Künste, um ehrlich zu sein.
 
echo von $_GET['page'] ist "kunden/kunde/seitenname" - Projekt liegt auf meinem Server unter domain.de/kunden/kunde - und obwohl die Subdomain kunde.domain.de genau in das Verzeichnis reinroutet, entstehen hinter der Subdomain die Links "/kunden/kunde/seitenname" - was für mich persönlich keinen Sinn macht, aber es passiert.
Das hängt davon ab, wie genau die Subdomains und deren Verzeichnis-Zuordnungen intern realisiert sind. Anyway, in deinem Fall wäre
[src=apache]RewriteBase /kunden/kunde/[/src]
passend (inklusive dem abschliessenden Slash).


Wie kann ich denn einen alphanumerischen Filter hinzufügen? Bin noch relativ am "Anfang" meiner php-Künste, um ehrlich zu sein.
Zum Beispiel indem du alle nicht-Alphanumerischen Zeichen ([^\w], d.h. nicht a-z, A-Z, 0-9, _) entfernst ...
[src=php]$page = preg_replace('/[^\w]/', '', (string)($_GET['page']));[/src]
... und in Folge $page verwendest.
 
Zurück
Oben