2 Stimmen

Wie kann man Anfragen, die nicht in bestimmte Verzeichnisse gehen, an index.php/path weiterleiten?

In meinem aktuellen Projekt habe ich mehrere Verzeichnisse: application (meine MVC-Dateien, auf die nicht zugegriffen werden darf), images, css und js. Eigentlich möchte ich, dass alle Anfragen an images/css/js unverändert weiterlaufen, aber alle anderen möchte ich aufrufen index.php/my/path .

Meine .htaccess sieht derzeit wie folgt aus und bringt mein Routing durcheinander.

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond $1 !^(index\.php|images|js|css|robots\.txt)
  RewriteRule ^(.*)$ http://example.com/index.php/$1 [L]
</IfModule>

Dies funktioniert nicht, da sich die relativen URLs stapeln, wie z. B.: example.com/blog/view/1/blog/view/2 .

Wenn ich etwas versuche wie

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/(index\.php|images|js|css|robots\.txt)
  RewriteRule ^ index.php%{REQUEST_URI} [PT]
</IfModule>

Ich erhalte diesen Fehler bei jeder Anfrage: No input file specified.


Wie kann ich erzwingen, dass alle Anfragen, die nicht an meine Verzeichnisse auf der Whitelist gerichtet sind, angerufen und nicht weitergeleitet werden (Umleitung tötet Postings, habe ich festgestellt), index.php/path ? IE, wenn /blog/view/1 vom Browser angefordert wird, .htaccess ruft auf. index.php/blog/view/1 . Die Referenzdateien auf der Apache-Website sind nicht sehr klar darüber, wie man so etwas macht - oder ich verstehe einfach nicht, was ich über RewriteRule lese.

Und ich möchte das wirklich verstehen. Warum wird Ihre Antwort funktionieren? Warum scheitern meine Versuche?

0 Stimmen

Für Unwissende wie mich: "Die L Flag weist den Apache an, die Verarbeitung der Rewrite-Regeln für diese Anfrage zu stoppen", weil ich die PT vor.

4voto

AntonioCS Punkte 8100

Dies ist, was ich in meiner .htaccess für mein Framework habe:

<IfModule mod_rewrite.c>
    RewriteEngine on

    #This will stop processing if it's images
    RewriteRule \.(css|jpe?g|gif|png|js)$ - [L] 

    #Redirect everything to apache
    #If the requested filename isn’t a file….
    RewriteCond %{REQUEST_FILENAME} !-f
    #and it isn’t a folder…
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ index.php?$1 [L,QSA] 
    #L = (last - stop processing rules)
    #QSA = (append query string from requeste to substring URL)
</IfModule>

Ich hoffe, das hilft.

PS: Vielleicht möchten Sie die Zeilen entfernen, um die Weiterleitung zu stoppen, wenn es sich um eine Datei oder einen Ordner handelt ;)

2voto

Robert K Punkte 29416

Antonio hat mir geholfen, auf die richtige Spur zu kommen, und hier ist das Ergebnis .htaccess :

<IfModule mod_rewrite.c>
  RewriteEngine on
  # skip if whitelisted directory
  RewriteRule ^(images|css|js|robots\.txt|index\.php) - [L]
  # rewrite everything else to index.php/uri
  RewriteRule . index.php%{ENV:REQUEST_URI} [NE,L]
</IfModule>

0voto

Andrew Noyes Punkte 5059

Das müssen Sie mit PHP machen. Wenn Sie zum Beispiel Ihre URI in etwas wie domain.tld/controller/action/param aufteilen möchten, könnten Sie zunächst den folgenden PHP-Code verwenden:

<?php

// Filter URI data from full path
$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);
$uri_string = trim($uri_string, '/');    // Make sure we don't get empty array elements

// Retrieve URI data
$uri_data = explode('/', $uri_string);

In diesem Fall ist $uri_data[0] der Controller, $uri_data[1] ist die Aktion, und darüber hinaus gibt es Parameter. Beachten Sie, dass dies keine narrensichere Methode ist und dass es nie eine gute Idee ist, sich auf Benutzereingaben wie diese zu verlassen, so dass Sie die Controller und Aktionen, die verwendet werden können, auf eine Whitelist setzen sollten.

Von hier aus können Sie, wenn Sie den Controller kennen und eine konsistente Verzeichnisstruktur haben, mit require_once den richtigen Controller anfordern und die Aktion mit Hilfe von variablen Variablen aufrufen.

0voto

Martin Bean Punkte 36399

Das verwende ich in meinem .htaccess Datei für mein CMS:

Options -Indexes

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1 [NC,L]

Und dann in meinem index.php Datei, die ich habe:

$path_info = '';
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $path_info;
$path_info = isset($_SERVER['ORIG_PATH_INFO']) ? $_SERVER['ORIG_PATH_INFO'] : $path_info;

$request = explode('/', trim($path_info, '/'));

// if $request[0] is set, it's the controller
// if $request[1] is set, it's the action
// all other $request indexes are parameters

Ich hoffe, das hilft.

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