Mod Rewrite und Includes

Wie wir alle wissen (sollten) ändert mod_rewrite keine Links im Script. Damit auch die Links auf Deiner Page auf die neuen "Rewrited URLs" zeigen bedarf es der Anpassung im Code. Fragen und Probleme rund um's Coding werden hier diskutiert.

Moderator: Super-Mod

Mod Rewrite und Includes

Beitragvon Shorty » 23.12.2005 02:53

Guten Morgen,

ich erstelle zurzeit eine neue Homepage und möchte dort nun mit Hilfe von Mod Rewrite meine URLs in Schönere umwandeln.

Soll heißen, dass ich übliche Links wie z.B. "index.php?inc=news" umwandeln möchte in "http://www.domain.de/news/".

Ich habe eine index.php, in der ich mit Hilfe der Switch-Case Funktion mehrere .php Dateien einbinde wie z.B. "News", "Über mich", "Gästebuch" usw. usf. Ebenfalls werden dort weitere Dateien wie die config.php oder meine Klasse includet.

Wenn ich nun eine Rewrite Rule eingebe, könnte ich die Seite zwar über beispielsweise "/news/" aufrufen, jedoch auch nur direkt diese Datei und nicht über die index.php. D.h. die Klasse z.B. wird nicht mehr gefunden und somit erhalte ich einen Fehler.

Meine .htaccess Datei sieht zurzeit folgendermaßen aus:

Code: Alles auswählen
RewriteEngine On
RewriteRule            ^/index.php?inc=(.*)$ /news/index.php


Hätte da jemand vielleicht eine Lösung?
Danke schonmal im Voraus

Mit freundlichen Grüßen
Shorty
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Gumbo » 23.12.2005 10:18

Das Apache-Modul „mod_rewrite“ kann nur Anfragen serverintern umschreiben oder umleiten, jedoch nicht den Antwortrumpf selbst verändern, was du deinem Beitrag nach zu urteilen vor hast.
Des Weiteren lässt sich die so genannte Query-String eines URLs nur mit der „RewriteCond“-Direktive verarbeiten, beispielsweise:
Code: Alles auswählen
RewriteEngine   on
RewriteCond     %{QUERY_STRING}   (^|&)inc=[^&]*
RewriteRule     ^foo$             /bar
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Shorty » 23.12.2005 12:41

Was sagt mir die Rewrite Condition in diesem Fall denn und wie kann ich mit ihr arbeiten?

Ich müsste ja dann praktisch auf dem Server nach der Klasse beispielsweise suchen und dem Modul dann sagen, dass sie sich in dem Ordner befindet, damit der Seitenaufruf einwandfrei funktioniert?

D.h. ich könnte hier ja "REQUEST_FILENAME" verwenden, aber ich sehe halt hierbei noch nicht, wie ich "-Cond" und "-Rule" so verknüpfe, dass mein Problem dadurch behoben wird.
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Gumbo » 23.12.2005 13:21

Erkläre bitte noch einmal ausführlich und vor allem verständlich dein „Problem“.
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Shorty » 23.12.2005 13:40

Prinzipiell möchte ich mit Mod Rewrite das Aussehen meiner Links "verschönern".
Den Link:
- index.php?inc="NAME" möchte ich umwandeln in "/NAME/".
- index.php?inc="NAME"&id="ID" möchte ich umwandeln in "/NAME/ID/".
- index.php?inc="NAME"&action="AKTION"&ID="ID"&ID2="ID2" möchte ich umwandeln in "/NAME/AKTION/ID/ID2/".
usw. usf. ...

In der "index.php" include ich die weiteren Dateien (auch meine Klasse zum Verbindungsaufbau zu der MySQL Datenbank).

Code: Alles auswählen
<?php
include('db.class.php');
...
switch($_GET['inc']) {
   case "news":
       include('news.php');
   break;
   case "about":
       include('about.php');
   break;
   ...
}
?>


Daber existiert weder der Ordner "/NAME/" oder der Ornder "/ID/" auf dem Server... Es soll lediglich nur angezeigt werden, jedoch intern weiterhin über die index.php?inc=NAME (z.B.) aufgerufen werden. Der Benutzer, der sich die Seite betrachtet, soll davon aber nichts mitbekommen.


Mein Problem ist nun Folgendes:

Die RewriteRule, die ich zurzeit verwende, öffnet mir zwar über "/NAME/" die Datei "NAME", aber nicht über die index.php. Logischerweise findet PHP meine Klasse nicht mehr (die wird ja nur in der index.php includet und nicht mehr in NAME.php) und gibt mir natürlich einen Fehler aus, weil ich beispielsweise einen Query aus dieser MySQL Klasse verwende, um mir die Daten aus der Datenbank zu holen für das Newssystem.

Ich weiß nicht, in wie weit ich Mod Rewrite sagen kann, dass er auch nach der Umwandlung der URL-Namen die Includedateien weiterhin findet.

Ist dies soweit verständlich? Wenn nicht, muss ich mich noch anders ausdrücken.
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Shorty » 23.12.2005 13:41

Da ich meine vorherigen Beitrag nicht editieren kann, muss ich darauf hinweisen, dass in Zeile 8 des Beitrages NICHT "index.html" stehen muss, sondern "index.html"
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Gumbo » 23.12.2005 14:05

index.php?inc="NAME" möchte ich umwandeln in "/NAME/"
Meinst du damit, dass „/index.php?inc=foobar“ auch unter dem Pfad „/foobar“ erreichbar sein soll, oder aber, dass sämtlich HTML-Verweise von „/index.php?inc=foobar“ in „/foobar“ geändert werden?
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Shorty » 23.12.2005 14:13

Ich meinte damit, dass "/index.php?inc=foobar" auch unter dem Pfad "/foobar" erreichbar sein soll.
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Shorty » 23.12.2005 16:08

Habe mittlerweile rausbekommen, dass die Ursache wohl daran liegt, dass die Umschreibung "news" genauso heißt wie die Datei "news.php". Der Server versucht das "news" zu ergänzen.

D.h. ich müsste jetzt einen Ausdruck finden, der "news" nur dann zulässt, wenn wirklich "news" abgeschickt wird. Ich könnte auch sonst den Dateinamen von news.php ändern, aber ich glaube, dass man es auch anders machen kann. Wie weiß ich noch nicht...
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Bob » 23.12.2005 17:24

MultiViews deaktivieren:

Code: Alles auswählen
Options -MultiViews
Bob
Moderator
Moderator
 
Beiträge: 5044
Registriert: 01.10.2004 13:10

Beitragvon Shorty » 23.12.2005 17:48

Aber dann wird die Umwandlung von index.php?inc=news in "/news" nicht mehr gefunden.
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Bob » 23.12.2005 18:00

Bist du dir sicher, dass deine RewriteRules greifen? Das tun sie dann jedenfalls nicht. Mit /news landest du durch MultiViews aber nicht auf index.php?inc=news, sondern auf /news.php

Nutzt du derzeit
Code: Alles auswählen
RewriteEngine on
RewriteRule ^([^./]+)$ /index.php?inc=$1 [L]

?
Bob
Moderator
Moderator
 
Beiträge: 5044
Registriert: 01.10.2004 13:10

Beitragvon Shorty » 23.12.2005 18:05

Zurzeit verwende ich:

Code: Alles auswählen
RewriteEngine   On
Options -MultiViews
RewriteRule ^([a-z]+)$ /index.php?inc=$1 [L]


Scheint mit Mutliviews zu funktionieren.

Muss ich denn innerhalb meines Newssystems noch etwas ändern?

Denn If-Anweisungen werden irgendwie übergangen und ich lande jetzt, obwohl man die Newsbeiträge jetzt sehen müsste, in der Bedingung, die greifen müsste, wenn kein Kommentar zu dem Newsbeitrag geschrieben wurde.

Edit:
Habe gerade mal die Fehlerintensität höher gesetzt und nun erhalte ich einen Fehler, dass die "newsid" undefiniert ist.

Edit2:
Edit hat sich erledigt :)... Habe den Fehler gerade in der .htaccess Datei gefunden.
Shorty
.
.
 
Beiträge: 12
Registriert: 17.12.2005 12:47

Beitragvon Bob » 23.12.2005 18:16

Scheint mit Mutliviews zu funktionieren.

Nein, mit MultiViews landest du nur auf der news.php, wenn du /news anforderst; durch MultiViews wirst du nie auf die index.php kommen, am QueryString wird sowieso nichts angehangen.
vgl http://httpd.apache.org/docs/2.2/mod/mo ... multiviews

Der Google-Test aus der :faq: funktioniert aber problemlos?
Bob
Moderator
Moderator
 
Beiträge: 5044
Registriert: 01.10.2004 13:10


Zurück zu Programmierung & Scriptanpassung für mod_rewrite

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron