2009-05-22 9 views
0

Ich habe eine Reihe von grob kodierten PHP-Dateien geerbt, deren Ausgabe ich programmatisch ändern muss.PHP include() betroffen von mod_rewrite

Um dies zu erreichen, entschied ich mich, sie durch eine andere PHP-Datei, rewriter.php, die sich wie etwa laufen aussieht:

<?php 
if(!preg_match('/^([a-zA-Z0-9\-_]*)$/', $_GET['page'])) 
    die('Incorrect page supplied.'); 
ob_start('changeOutput'); 

include($_GET['page'].'.php'); 
ob_end_flush(); 

function changeOutput ($buffer) { 
    ... 
} 
?> 

ich mod_rewrite, um sie zu zwingen, durch diese Datei auszuführen:

RewriteEngine On 
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 

Es wird jedoch eine Fehlermeldung angezeigt, die mich glauben lässt, dass die include() -Anweisung von der obigen RewriteRule betroffen ist, dh es versucht, rewriter.php über rewriter.php und so weiter zu starten.

Ich nehme an, es gibt viele Möglichkeiten, dieses Problem anzugehen, aber ich bin speziell auf der Suche nach einer Möglichkeit zu entkommen die include() -Anweisung von mod_rewrite betroffen sein. Ich habe die Moduldokumentation durchgesehen, aber ich konnte nichts Relevantes finden.

Natürlich sind Alternativen zu diesem Ansatz auch willkommen.

Vielen Dank für Ihre Zeit und Ihr Denken.

Mit freundlichen Grüßen,
Daniel

+0

Sehr unwahrscheinlich. Und was ist wieder in der Fehlermeldung? – Gleb

+0

Sind Sie sicher, dass Ihr Skript aus dem erwarteten Verzeichnis ausgeführt wird? Das könnte so aussehen, als wäre es umgeleitet worden. – Dave

+0

Führen Sie diese Umschreibungsregeln aus dem Kontext einer Datei mit der Datei conf (.htaccess) oder der Datei apache conf (httpd.) Aus.Konf) Datei? –

Antwort

2

Klingt wie Sie für RewriteCond suchen, die im Wesentlichen eine bedingte Anweisung für mod_rewrite ist

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !rewriter.php$ 
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 [L] 

Diese Ihre Regel verhindern von URLs angewendet werden, die in enden rewriter.php.

+0

Danke, Alan, das ist was ich gesucht habe. Das war viel einfacher als ich erwarte. – DXL

-1

Fügen Sie die Art und Weise verwendet, um Sie es auf das Dateisystem beziehen sich und umgehen die Mod-Rewrite-Übersetzungs-Engine.

Ich würde Ihren regulären Ausdruck beobachten.

/^([a-zA-Z0-9\-_]*)$/ 

passen leere Zeichenfolge auch.

Versuchen

/^([a-zA-Z0-9\-_]+)$/ 

und sehen, ob $ _GET [ 'page'] leer ist oder nicht.

1

Sie sollten zunächst prüfen, ob die Datei, um sie vor einschließlich vorhanden:

if ($_GET['page'] != 'rewriter' && is_file($_GET['page'].'.php')) { 
    include $_GET['page'].'.php'; 
} else { 
    // file does not exist or is invalid 
} 
+0

Das würde funktionieren, aber würde jeder Anfrage auf der Site einen zusätzlichen Dateistatus hinzufügen. Wahrscheinlich keine große Sache auf einer Baustelle mit wenig Verkehr, aber leicht vermeidbar durch die Handhabung auf der Apache-Ebene. –

0

Sie können eine RewriteCond bedingte zu Ihrem htaccess hinzufügen, um zu sehen, wird überprüfen, ob die Datei vorhanden ist. Ähnlich wie der Kommentar von Gumbo, außer etwas schneller (und leichter Code-weise).

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 

Diese prüft, ob es sich um eine Datei oder ein Verzeichnis in Bezug auf die Wurzel Ihrer Website ist. Wenn ja, wird der Rewriter ausgeführt. Ein kurzer Hauch von .htaccess awesomeness :)

+0

Dies wird nicht funktionieren. Eine Datei darf keine reguläre Datei ('-f') und kein Verzeichnis (' -d') gleichzeitig sein. – Gumbo