2011-01-09 5 views
4

Ich arbeite an einem neuen PHP-Framework für den persönlichen Gebrauch in zukünftigen Projekten, und unten ist meine geplante Dateistruktur so weit. Ich brauche nur etwas Hilfe mit einigen Regex für meine .htaccess-Datei und etwas Hilfe, wie ich die Dateien laden kann, die ich will.Hilfe mit Bootstrap und Regex für PHP

Grundsätzlich sollte jeder "Ordner" nach der Domäne von meinem "Modul" Ordner geladen werden. Ich möchte es laden www.domain.com/account/ von www.domain.com/module/account/. Ich will es auch in diesem Format für jeden anderen Ordner, den ich unter Modulen habe. Alle Ordner/Dateien unter "Modul" sollten so geladen werden, als ob sie auf der obersten Ebene wären.

In diesem Beispiel, obwohl in meinem Modul/Konto/Ordner, wenn ich eine Datei namens home.php haben, dann sollte ich in der Lage sein, es statt www mit www.domain.com/account/home zuzugreifen. domain.com/module/account/home.php und www.domain.com/module/user/register.php würde tatsächlich von www.domain.com/user/register

ich zugegriffen werden hoffe das macht Sinn und schätze jede Hilfe und jeden Rat. Ich brauche hauptsächlich Hilfe mit der .htaccess Datei, um diese Ordnerstruktur arbeiten zu lassen. Ich habe nicht entschieden, ob auf alle Dateien über eine einzelne Indexdatei zugegriffen werden soll oder ob ich nur eine Bootstrap-Datei in jede Seite einfügen soll. Die Bootstrap-Datei würde alle Variablen und Konfigurationsoptionen einrichten sowie alle Klassendateien automatisch laden und benötigte Objekte erstellen.

myFramework/ 
--/assets/ 
--------/css/ 
--------/images/ 
--------/javascript/ 
--/includes/ 
---------/classes/ 
---------/config/ 
---------/language/ 
---------/header.php 
---------/footer.php 
--/module/ 
--------/account/ 
----------------/create.php 
----------------/login.php 
----------------/logout.php 
----------------/settings.php 
----------------/editprofile.php 
--------/admin/ 
--------/blog/ 
--------/forums/ 
--------/messages/ 
--------/users/ 
--index.php 

Antwort

3

Die Antwort von jasonbar ist eigentlich fast da. Alles, was es fehlt mit der Endung .php zu tun, wie Sie beschrieben:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^/module 
RewriteCond %{REQUEST_URI} [.]php$ 
RewriteRule (.*)[.]php$ /module/$1 

Dass Sie nachdrücklich empfohlen, ein Front-Controller-Paradigma zu prüfen, würde ich gesagt fördern (wie Sie zur Beschreibung in Ihrem Problem ausgewichen) als dabei ermöglicht eine viel größere Kontrolle, eine MVC-Ansatz usw. = o)

EDIT ermutigt:

korrigierte ich ein paar Punkte vernachlässigt und hinzugefügt ordnungsgemäße Bearbeitung der PHP-Erweiterung. Beachten Sie, dass das Argument [L] am Ende bewirkt, dass die weitere Verarbeitung aufhört, wodurch diese Codeblöcke als logische Strukturen innerhalb Ihrer .htaccess-Datei nützlich sind (d. H. Indem jegliche nachfolgende Verarbeitung verhindert wird); entfernen Sie dieses Argument, wenn eine solche Funktionalität nicht erwünscht ist.

Ich habe auch eine Zeile hinzugefügt, um speziell zu überprüfen, dass die angeforderte PHP-Datei tatsächlich existiert.

RewriteEngine On 

# if the uri matches a directory in the module dir, redirect to that. Disable 
# this block if you don't wish to have either directory browsing or to have the 
# default apache file load. 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}/module%{REQUEST_URI} -d 
RewriteCond %{REQUEST_URI} !^/includes 
RewriteCond %{REQUEST_URI} !^/assets 
RewriteCond %{REQUEST_URI} !^/module 
RewriteRule (.*) /module/$1 [L] 

# if the uri matches a file sans the .php extension in the module directory, 
# then redirect to that. 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}/module%{REQUEST_URI}.php -f 
RewriteCond %{REQUEST_URI} !^/includes 
RewriteCond %{REQUEST_URI} !^/assets 
RewriteCond %{REQUEST_URI} !^/module 
RewriteRule (.*) /module/$1.php [L] 

EDIT:

Um auch zu erlauben, Dateien, die in ".php" enden aus dem Modulverzeichnis bedient werden, um Ihre folgende hinzuzufügen..htaccess-Datei:

# if the uri matches a file with the .php extension in the module directory, 
# then redirect to that. 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}/module%{REQUEST_URI} -f 
RewriteCond %{REQUEST_URI} !^/includes 
RewriteCond %{REQUEST_URI} !^/assets 
RewriteCond %{REQUEST_URI} !^/module 
# note that the following line restricts access to php files only. comment out 
# the following line to allow any existing file under module director to be 
# accessed (or modify the following to allow other file extensions to be read) 
RewriteCond %{REQUEST_URI} [.]php$ 
RewriteRule (.*) /module/$1 [L] 
+0

Hallo, ich versuche sowohl das Beispiel als auch das Beispiel von jasonbar und ich kann nichts davon zum Laufen bekommen. Ich habe mit verschiedenen Tests verifiziert, dass das Mod-Rewrite aktiviert ist. Hast du irgendwelche Vorschläge? – JasonDavis

+0

@jasondavis - Was meinst du, es funktioniert nicht? Bitte posten Sie die Ergebnisse Ihres Rewrite Logs mit RewriteLogLevel 9 und RewriteLog /var/log/apache2/rewrite.log in Ihrer Konfigurationsdatei. Welches Verhalten siehst du? Bitte veröffentlichen Sie einen Testfall, damit wir replizieren können. Vielen Dank. – jmort253

+0

Diese Lösung erlaubt nicht den Zugriff auf die index.php, die Ordner und Dateien außerhalb von/module, wie zum Beispiel den Ordner/includes, und lässt nicht zu, dass die Erweiterung .php weggelassen wird. – jmort253

0

Wenn ich Sie verstehe, sollte dies funktionieren. Die Bedingungen führen dazu, dass es nur umleitet, wenn die angeforderte Ressource keine echte Datei/Verzeichnis ist und wenn sie nicht bereits aus dem Modulverzeichnis angefordert wird.

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^/module 
RewriteRule (.*) /module/$1 
+0

danke für die Antwort, ich habe es ausprobiert, aber es scheint nicht zu funktionieren, andere Ideen? Danke – JasonDavis

2

Nach Ihren Anforderungen zu lesen, ich habe mit der folgenden Lösung kommen:

RewriteCond %{REQUEST_URI} !^/includes 
RewriteCond %{REQUEST_URI} !^/assets 
RewriteCond %{REQUEST_URI} !^/module 
RewriteCond %{REQUEST_URI} !^/index\.php 
RewriteRule (.*)(\.php)?$ /module/$1 

ich überprüft haben, das funktioniert mit folgendem URL-Muster unter Verwendung von Apache 2.2:

Weiterleitung an Modulordner:

http://local.sandbox.com/account/home.php?t=t
http://local.sandbox.com/account/home.php
http://local.sandbox.com/account/home.php/?t=t
http://local.sandbox.com/account/home?t=t
http://local.sandbox.com/account/home/?t=t
http://local.sandbox.com/account/home/
http://local.sandbox.com/account/home
http://local.sandbox.com/user/register
http://local.sandbox.com/user/register.php
http://local.sandbox.com/user/register?t=t
http://local.sandbox.com/user/register.php?t=t

Hat umleiten nicht, da diese URIs ausgeschlossen sind:

http://local.sandbox.com/includes/header.php
http://local.sandbox.com/includes/header.php?t=t
http://local.sandbox.com/index.php?t=t
http://local.sandbox.com/?t=t

Beachten Sie, dass die RewriteCondition im Wesentlichen eine ist, bestehend aus NICHT Bedingungen, so dass jeder Ordner oder eine Datei, die Sie aus der Rewrite-Regel ausschließen wollen, muss als NOT-Bedingung hinzugefügt werden.

Die Modulregel ist inklusive, was bedeutet, dass alle neuen Ordner, die Sie in den Modulordner stellen, automatisch Ihren Neuschreibanforderungen unterliegen.

+0

danke das ist hilfreich – JasonDavis

+0

Das ist nicht ganz so; Die Rewrite-Regel entfernt hier die Erweiterung .php und leitet den Prozess ohne ihn in das Modulverzeichnis um. Es ist eine schnelle der Einstellungen für Ihre Apache-Setup, die diese Konfiguration ermöglicht, Ihre Dateien zu bedienen. – emanaton

+0

@emanaton - Haben Sie einen Link, der sich auf die Apachen-Eigenart bezieht? Ich bin daran interessiert, mehr darüber zu erfahren. Danke, dass du es aufgezeigt hast. – jmort253

3

Ich würde versuchen, dies in PHP selbst zu lösen, wenn es nach mir ginge. Erstellen Sie einfach eine .htaccess-Datei, die jede mögliche Anfrage auf eine einzige Datei (wahrscheinlich index.php) abbildet und bestimmt, was von dort zu tun ist. Das gibt Ihnen die Möglichkeit, alle Arten von Bootstrapping und Protokollierung durchzuführen, bevor Sie die Anforderung an den Code delegieren, der diese Anforderung verarbeiten soll. Sie könnten sogar ein Mikro-Framework wie Limonade hinzufügen und verwenden, um zu erreichen, was Sie wollen. Hier ein Beispiel:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d # if the requested directory does not exist, 
RewriteCond %{REQUEST_FILENAME} !-f # and the requested file does not exist, 
RewriteRule^index.php    # map everything to index.php. 

Dann in index.php, können Sie eine Vielzahl von Dingen tun, um sicherzustellen, dass Sie die richtige Antwort. Der einfachste Weg, eine "Controller-ähnliche Struktur" zu verwenden, wäre, ein Framework wie Limonade einzubinden und zu verwenden. Ein Beispiel:

Offensichtlich ist das nur ein Vorschlag. Alternativ könnten Sie auch ein noch einfacheres System verwenden, obwohl ich denke, dass Sie das selbst schreiben müssten. Auf diese Weise können Sie sagen, wenn die Datei im Modulverzeichnis vorhanden ist, fügen Sie einfach diese Datei ein, und das ist es.

<?php 
$path = isset($_SERVER['PATH_INFO']) ? trim($_SERVER['PATH_INFO'], '/') : null; 
if($path !== null) { 
    $filename = 'module/' . $path . '.php'; /** $path could be account/home */ 
    if(file_exists($filename)) { 
     require_once $filename; 
    } 
    else { 
     require_once 'error.php'; 
    } 
} 
else { 
    require_once 'home.php'; 
} 

Das ist es. Voll funktionsfähig und alles. Sie könnten davon profitieren, eine Bibliothek zu verwenden, die das alles für Sie sortiert.

+0

danke, wenn ich mehr Zeit bekomme ich werde dies untersuchen, wollte ich wirklich vermeiden, alles durch 1 Datei wie folgt, aber es könnte eine bessere Option sein – JasonDavis

+0

Würden Sie nicht auch in der Lage sein, das Umschreiben Protokoll für die Protokollierung und verwenden Verlasse dich auf den LAMP-Stack? – jmort253

0

Ich entwickle ein PHP-Framework mit einem Kollegen, so dass dies meine Aufmerksamkeit erregt hat.

Unser .htaccess nimmt eine minimale Anzahl von Annahmen vor. Es sieht wie folgt aus:

DirectoryIndex index.php 
RewriteEngine on 
RewriteBase/

RewriteCond %{REQUEST_URI} \.png$ 
RewriteRule ^(.*)$ $1 [QSA,L] 

RewriteCond %{REQUEST_URI} \.gif$ 
RewriteRule ^(.*)$ $1 [QSA,L] 

RewriteCond %{REQUEST_URI} \.jpg$ 
RewriteRule ^(.*)$ $1 [QSA,L] 

RewriteCond %{REQUEST_URI} \.js$ 
RewriteRule ^(.*)$ $1 [QSA,L] 

RewriteCond %{REQUEST_URI} \.pdf$ 
RewriteRule ^(.*)$ $1 [QSA,L] 

RewriteCond %{REQUEST_URI} \.css$ 
RewriteRule ^(.*)$ $1 [QSA,L] 

RewriteCond %{REQUEST_URI} ^/favicon* 
RewriteRule ^(.*)$ favicon.ico [QSA,L] 

#RewriteCond %{REQUEST_FILENAME} !-f 
#RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)$ index.php?$1 [QSA,L] 

index.php wiederum sieht wie folgt aus:

<?php 

namespace System; 

try 
{ 
     ob_start(); 

     $Indium = include 'src/bootstrap/IndiumFactory.php'; 
     $Indium->run(); 
} 
catch (\Exception $e) // catch errors and display/log 
{ 
     Error::indium_exception_handler($e); 
     Error::render_error_page(); 
} 

IndiumFactory das Bootstrap-Programm ist, die die Umwelt einrichtet. Indium ist der Name unseres Rahmens. IndiumFactory wird automatisch aus einer Reihe von Konfigurationsdateien generiert.

Vielleicht sollte ich klarstellen, dass Indium einen Mechanismus zum Laden und Aufrufen der richtigen Controller-Klasse mit dem Rest von REQUEST_URI als Argumente hat. Unsere Formulare basieren auf POST: ed-Daten, so dass wir ziemlich strenge Regeln/Filter auf den URI anwenden können.

+0

Können Sie herausfinden, was alle Bilddateien in Ihrem htaccess tun? Ich habe mich fast dazu überreden können, etwas Ähnliches zu tun, was Sie tun (auf eine andere Art und Weise), aber anstatt eine PHP-Datei für einen Abschnitt zu verwenden, würde es eine Klasse/Methoden für einen Abschnitt auf der Grundlage der URL nennen. Ich bin jetzt fest darauf, herauszufinden, wie ich mit Dingen wie Paging umgehen kann oder in meiner App hat ein Benutzer eine Benutzer-ID-Nummer, um zum Beispiel ein Blog eines anderen Benutzers anzuzeigen, ... Fortsetzung nächsten Kommentar – JasonDavis

+0

.. .. Ich muss dort Benutzer-ID in der URI sowie Paging haben, wird es eine Seitennummer sein. Irgendwelche Ideen, wie ich die Nummer von der URI bekommen und sie benutzen kann? Ich dachte daran, nur meine URI für die Existenz einer Nummer zu überprüfen, aber das wird nicht funktionieren, da einige Zahlen für eine Benutzer-ID, Blog-ID, Forum Thema ID, Paging – JasonDavis

+0

Es ist nur die Art, wie unser Framework eingerichtet ist. Wir lassen Apache keine PHP-Dateien bedienen, sondern die Datei index.php, die das Framework bootstrappt. Da alle Dateitypen explizit angegeben sind, können wir genau darüber nachdenken, welche Arten von Dateien wir verarbeiten dürfen. Am Ende wird .htaccess automatisch für jeden Client automatisch generiert. –