Problem mit mod_rewrite()
Günther S
- php
Hallo zusammen,
ich bin mit meiner Website (ist allerdings noch in Bearbeitung, daher darf ich leider den Link (noch) nicht veröffentlichen) auf einen neuen Webspace umgezogen und habe seitdem bei einigen Unterseiten die Fehlermeldung, dass die Klasse Smarty nicht gefunden wird.
das ganze ist so aufgebaut:
www.domain.de/index.php?section=register << das wäre die URL zur Registrierungsseite.
durch mod_rewrite kommt man durch auf diese seite mit www.domain.de/register/
Auf dem alten Webspace hat alles wunderbar geklappt und ich hatte nie Fehlermeldungen dort. Nur jetzt seit ich umgezogen bin (und an den PHP-Dateien und der Dateistruktur rein gar nichts verändert habe) klappt es nicht mehr (auf dem neuen Space).
Außerdem:
wenn ich die URL normal eingebe (...index.php?section=register), dann wird die Klasse Smarty weiterhin gefunden.
Nur wenn man versucht die Seite über .../register/ zu besuchen geht es nicht mehr, also nehme ich an mein Problem liegt irgendwo in meiner .htaccess datei..
Hier ein Ausschnitt:
(die Dateien .htaccess und .htpassw und die index.php der website liegen alle im Verzeichnis /home/usr/public_html/)
AuthName "MeineSeite"
AuthType Basic
AuthUserFile /home/usr/public_html/.htpasswd
require valid-user
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^\.htaccess$ - [F]
#...
#hier kommen noch einige spezielle RewriteRules, die allgemeine Regel für ?section=... #ist aber folgende:
RewriteRule ^([a-z]+)/$ ?section=$1
Grober Aufbau der index.php:
<?php
define('SMARTY_DIR', './Smarty/');
require(SMARTY_DIR.'Smarty.class.php'); // ist in register.php aus irgendeinem Grund nicht mehr verfügbar
require("inc/functions.php"); // Die in dieser Datei definierten Funktionen sind in register.php auch nicht verfügbar
include($section); // $section hat in dem Fall den Wert "register.php"
?>
Wenn ich über www.domain.de/register/ die seite besuche lautet die genau Fehlermeldung:
Fatal error: Cannot instantiate non-existent class: smarty in /home/usr/edirectory/public_html/register.php on line 3
==> Die Datei register.php wird schon erfolgreich eingebunden, aber die zuvor eingebundenen Funktionen/Klassen sind aus irgendeinem Grund nicht verfügbar.
Hat jemand eine Idee woran das liegen könnte?
Wiegesagt vermute ich die Fehlerquelle in der .htaccess, aber ich bin natürlich für Vorschläge jeglicher Art dankbar.
Gruß,
Günther S.
hi,
include($section); // $section hat in dem Fall den Wert "register.php"
Woher das bitte?
Du hast doch laut deinen Angaben per Rewriting dafür gesorgt, dass das Script mit dem QueryString ?section=register aufgerufen wird - wo also soll die Endung ".php" herkommen?
Und informiere dich bitte über register_globals=off.
Wenn ich über www.domain.de/register/ die seite besuche lautet die genau Fehlermeldung:
Fatal error: Cannot instantiate non-existent class: smarty in /home/usr/edirectory/public_html/register.php on line 3
Und was steht in register.php?
gruß,
wahsaga
Hallo wahsaga,
include($section); // $section hat in dem Fall den Wert "register.php"
Woher das bitte?
Du hast doch laut deinen Angaben per Rewriting dafür gesorgt, dass das Script mit dem QueryString ?section=register aufgerufen wird - wo also soll die Endung ".php" herkommen?Und informiere dich bitte über register_globals=off.
register_globals ist aus, die Variable $section hat nichts mit $_GET['section'] zu tun sondern wird innerhalb der index.php definiert.
Also im Endeffekt steht da folgendes:
include("register.php");
Die register.php fängt so an:
<?php
$smarty = new Smarty();
$smarty -> assign('logged_in', 0);
if(logged_in() == true)
{
$smarty -> assign('logged_in', 1);
}
// ...
?>
Gruß,
Günther S.
hi,
register_globals ist aus, die Variable $section hat nichts mit $_GET['section'] zu tun sondern wird innerhalb der index.php definiert.
OK, das war mir so nicht klar.
Andere Idee:
Die Datei register.php liegt also ebenfalls direkt unterhalb des Webroots, ist also über www.domain.de/register.php direkt aufrufbar, richtig?
Dann könnte es sein, dass
a) dein Rewriting überhaupt nicht "funktioniert" (RewriteEngine gar nicht verfügbar, o.ä.), und
b) MultiViews aktiviert ist.
Dann hättest du folgenden Effekt:
www.domain.de/register wird nicht umgeschrieben, aber weil MultiViews aktiviert ist, wird bei der Suche nach einer Ressource namens "register" die vorhandene Datei "register.php" als passender Ersatz angesehen.
Es wäre dann also ein direkter Aufruf der register.php - und in der ist Smarty jetzt natürlich nicht verfügbar, weil deine Includes der Klasse in der index.php gemacht werden, die hier aber gar nicht aufgerufen wurde.
Teste das erst mal (in dem du bspw. in die index.php noch eine Kontrollausgabe einbaust, echo "in index.php" o.ä.), und wende dich ggf. an deinen Hoster bzgl. der Frage, ob du mod_rewrite überhaupt benutzen kannst.
gruß,
wahsaga
Hallo wahsaga!
Dann könnte es sein, dass
a) dein Rewriting überhaupt nicht "funktioniert" (RewriteEngine gar nicht verfügbar, o.ä.), und
b) MultiViews aktiviert ist.
Genau so ist es!
mod_rewrite ist aktiviert (laut phpinfo()) und funktioniert auch.
Ich habe in der .htaccess ja noch ein paar Spezialregeln, z.b. folgende:
RewriteRule ^profile/([0-9]+)/$ ?section=mitglieder&profilid=$1
Diese Weiterleitung funktioniert hervorragend, wohl deswegen, weil es kein Verzeichnis profile/ mit irgendeiner Datei namens 130.php darin gibt, durch MultiViews kann hier also nichts mehr schief gehen wenn ich das richtig verstanden habe.
Jetzt aber meine nächste Frage, kann ich MultiViews (z.b. ähnlich wie register_globals in .htaccess) irgendwie abschalten, ohne auf die Apache Konfiguration zugreifen zu können?
Und findet man in phpinfo() irgendwo etwas zu MultiViews (zu dem Namen habe ich nichts gefunden, aber vielleicht muss man da ja nach etwas anderem suchen?)?
Gruß und vielen Dank schonmal,
Günther S.
hi,
Jetzt aber meine nächste Frage, kann ich MultiViews (z.b. ähnlich wie register_globals in .htaccess) irgendwie abschalten,
Ja, über Options.
ohne auf die Apache Konfiguration zugreifen zu können?
Scherzkeks, was glaubst du was .htaccess _ist_? :-)
Es ist eine von mehreren Möglichkeiten, den Apachen zu konfigurieren.
Ob es über Options in einer .htaccess geht, hängt davon ab, wie dein Provider AllowOverride konfiguriert hat.
Und findet man in phpinfo() irgendwo etwas zu MultiViews
Nein, phpinfo() liefert (fast) ausschließlich Informationen über die Konfiguration von PHP, einzelne Apache-Einstellungen kannst du da nicht überprüfen.
gruß,
wahsaga
Hi wahsaga,
vielen Dank für die Hilfe, jetzt klappt alles!
Gruß,
Günther S.