3 Stimmen

Wie machen Websites das index.php?something=somepage

Ich habe viele PHP-basierte Websites gesehen, bei denen es egal ist, wohin man navigiert, man steckt immer bei der index.php fest und es werden zufällige Parameter in der URL übergeben. Und wenn ich mir eine Open-Source-Version anschaue, die dasselbe tut, hat die index.php eine Menge includes darin.

Wie kann ich das gleiche tun? Beinhaltet dies Mod-Rewrite?

Danke

6voto

cletus Punkte 596503

Ich habe das gesehen und persönlich denke ich, dass es ein schreckliches Design ist. Besonders, weil viele Leute dazu neigen, den include-Parameter nicht zu bereinigen, sodass jemand jede Datei einbinden kann, die er möchte, indem er einfach einen relativen Pfad übergibt.

mod_rewrite wird typischerweise verwendet, um URLs wie:

/index.php?path=user&include=account

zu verstecken und sie durch etwas wie:

/user/account

zu ersetzen, wie hier:

RewriteEngine On
RewriteBase /
RewriteRule ^(\w+)/(\w+)$ /index.php?path=$1&include=$2 [L]

Ich füge normalerweise auch etwas wie das hier ein:

RewriteRule %{THE_REQUEST} \.php$ [R=404,L]

Ich erinnere mich nicht an die genaue Syntax, aber grundsätzlich geht es darum, dass der Benutzer keine php-Datei direkt anfordern kann. Es muss über eine andere RewriteRule erfolgen (wie die erste), was Ihnen viele Kopfschmerzen bei der Bereinigung der Abfragezeichenfolgeneingabe ersparen kann und das gesamte Problem vermeiden kann, dass PHP für Dinge globale Variablen erstellt, die Sie nie beabsichtigt haben (obwohl sie dies immer noch per POST tun können).

Wie auch immer, zurück zu der Frage, warum ich glaube, dass dies eine schreckliche Idee ist. Sie tun dies, weil sie dazu tendieren, etwas gemeinsamen Code auf jeder Seite zu wollen (wie ein Header und ein Footer). Ich würde argumentieren, dass es tatsächlich besser ist, einfach eine gemeinsame Datei am Anfang jeder Ihrer Seiten einzubinden. Es ist ein einfacheres, klareres Design.

0 Stimmen

Schreckliches Design wirklich! Ich hasse es auch.

0 Stimmen

Ich denke nicht, dass es schrecklich ist. Sicherlich kein großartiges Design, aber für einfache Websites ist es ausreichend.

0 Stimmen

Wenn es auf Rewrite-Regeln beruht, hat es sofort ein Problem.

2voto

rmontagud Punkte 153

Sie führen direkte Einschlüsse durch, natürlich mit einigen Überprüfungen, aber grundsätzlich sieht es so aus:

include("content/".$_GET['something'].".php");

Sie können es auch mit "something" als Schlüsselwort in der Datenbank verwenden, aber die meisten index.php?somthing=iirgendwo, die ich gesehen habe, sind Einschlüsse mit einigen Sicherheitsüberprüfungen.

0 Stimmen

Natürlich nicht! Aber wie gesagt, es gibt Hunderte, die es tun, du wirst sie mit paranoiden Überprüfungen oder gar keiner Überprüfung finden...

0voto

staticsan Punkte 29057

Die Art und Weise, wie dies funktioniert, besteht darin, dass die Anwendung nicht mehr als Sammlung von Seiten, sondern als monolithische Einheit geschrieben wird, die in mehrere Dateien unterteilt ist. Mit anderen Worten, index.php ist die Anwendung und sie nimmt Parameter entgegen, um zu steuern, welchen Teil sie Ihnen zeigt.

Es gibt verschiedene Möglichkeiten, die Seiteninformationen in der URL zu übergeben. Das Verwenden von Verweisen auf tatsächliche Dateinamen sollte nicht der erste Weg sein, den Sie ausprobieren. Teilen Sie stattdessen Ihre Anwendung in verschiedene Befehle und Unterbefehle auf. Dann sind die ersten beiden Dinge, die index.php tut:

  1. Richten Sie das Anwendungs-Framework ein (laden von gemeinsamen Bibliotheken, Einrichten des Datenbankzugriffs usw.)
  2. Finden Sie heraus, welcher Befehl angefordert wird.

Das zweite wäre eine Art Nachschlagevorgang, entweder in ein Array oder Suche nach einer Klasse oder vielleicht einer Datei in einem bestimmten Verzeichnis. Was auch immer es tut, es muss die Daten als nicht vertrauenswürdig behandeln und eine Fehlerseite oder eine Standardseite mit einem Fehlerbanner erstellen, wenn der Befehl ungültig ist. (Wenn er in einem Dateinamen verwendet werden soll, stellen Sie sicher, dass er angemessen umgewandelt wird [z.B. .php hinzugefügt] und auf jegliche Jailbreak-Aktion überprüft wird [z.B. enthält keine eingebetteten Schrägstriche]).

0voto

adolfojp Punkte 3011

Sie sehen sich Websites an, die mit einem Front-Controller erstellt wurden.

http://de.wikipedia.org/wiki/Front-Controller

Viele beliebte PHP-Anwendungen wie Joomla verwenden ihn, um eine Sammlung von Skripten als zusammenhängende Anwendung zu behandeln.

Ein Front-Controller ist eine gute Idee für Sprachen wie PHP, aber denken Sie daran, den Front-Controller mit etwas wie mod_rewrite zu verstecken, um eine URL-Canonicalization zu erstellen und die Lesbarkeit zu optimieren.

0voto

kdgregory Punkte 37614

Dieser Typ von URL ermöglicht es Ihnen, eine einzige Vorlagendatei zu verwenden, die gemeinsame Markup-Sprache spezifiziert, mit einem enthaltenen Fragment, das spezifischen Text enthält. Dieses enthaltene Fragment könnte eine tatsächliche Datei im Dateisystem sein oder es könnte sich um ein CLOB in einer Datenbank handeln, wobei der "page" Parameter den Primärschlüssel angibt.

Wie andere bereits angemerkt haben, ist die Weitergabe eines genauen Pfads überhaupt nicht sicher - tun Sie es nicht. Im besten Fall kann es verwendet werden, um Ihre Website zu erkunden und nicht öffentliche Inhalte abzurufen. Im schlimmsten Fall kann es dazu führen, dass Ihre Website unwissentlich als Proxy für Inhalte dient, die Sie nicht rechtlich mit sich in Verbindung bringen möchten. Irgendwo dazwischen könnte es einem Hacker die Möglichkeit bieten, neuen Inhalt physisch in Ihre Website einzufügen.

Ein sichererer Ansatz ist die Verwendung der Datenbanktabelle oder (für kleinere Websites) einer In-Memory- Seitentabelle. Hier ist der Code, den ich verwende, um auf die Seitentabelle meiner persönlichen Website zuzugreifen:

$pageName = (array_key_exists("page", $_GET))
          ? $_GET["page"]
          : null;
$currentPage = (array_key_exists($pageName, $pagetab))
             ? $pagetab[$pageName]
             : $pagetab["home"];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X