2013-09-04 4 views
10

Ich habe diese Struktur: site.com/api/index.php. Wenn ich Daten an site.com/api/ senden, gibt es kein Problem, aber ich stelle mir vor, es wäre besser, wenn die API auch ohne den Schrägstrich funktionieren würde, so: site.com/api. Dies führt zu einer 301-Umleitung und damit zu einem Verlust der Daten (da Daten nicht weitergeleitet werden). Ich probierte jedes Umschreiben aus, das mir einfiel, und konnte die Umleitung nicht vermeiden. Dies ist meine aktuelle Regel zum erneuten Schreiben (obwohl sie irrelevant sein kann).Wie Zugriff auf Verzeichnis index.php ohne einen Schrägstrich und nicht erhalten 301 Umleitung

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/(.*)$ api/index.php [L] 

Kann ich diese URL arbeiten und die Post-Daten beibehalten, ohne den Schrägstrich zu verwenden?

Einige umschreibt, die nicht funktioniert haben: (alle noch umleiten)

RewriteRule ^api$ api/index.php [L] 
RewriteRule ^api/*$ api/index.php [L] 
+0

Der Schrägstrich durch die Apache-Modul mod_dir hinzugefügt: http://httpd.apache.org/docs/2.2/mod/mod_dir.html –

+0

Auch Ihre Rewrite-Regel, so wie sie geschrieben ist, hat den abschließenden Schrägstrich als Teil der Regel. Sie könnten wahrscheinlich einfach das '/' aus der Regel entfernen und es würde funktionieren. –

+0

Rechts. Ich dachte, dass ich eine Anfrage in dieses Verzeichnis direkt in index.php schreiben könnte, so dass das Modul niemals startet, aber es hat nicht funktioniert. Ich werde aktualisieren, um zu zeigen, was ich dort versucht habe. – m59

Antwort

11

Sie würden erstes Verzeichnis slash ausschalten müssen, aber es gibt einen Grund, warum es sehr wichtig ist, dass ein Schrägstrich gibt es:

Mod_dir docs:

Drehen der Schrägstrich Umleitung off in einer Offenlegung von Informationen führen kann. Stellen Sie sich eine Situation vor, in der mod_autoindex aktiv ist (Options +Indexes) und DirectoryIndex ist auf eine gültige Ressource (z. B. index.html) festgelegt und es gibt keinen anderen speziellen Handler für diese URL definiert. In diesem Fall würde eine Anfrage mit einem Schrägstrich die Datei index.html anzeigen. Aber eine Anfrage ohne abschließenden Schrägstrich listet den Verzeichnisinhalt auf.

Das bedeutet, ein Verzeichnis ohne einen Schrägstrich Zugriff einfach den Verzeichnisinhalt auflisten, anstatt den Standardindex dienen (z index.php). Also, wenn Sie Verzeichnis Slash ausschalten wollen, müssen Sie sicherstellen, um intern die hintere zu umschreiben Slash zurück in.

DirectorySlash Off 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ /$1/ 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^api/(.*)$ api/index.php [L] 

Die erste Regel stellt sicher, dass der Schrägstrich am Ende angehängt wird, wenn auch nur intern. Im Gegensatz zu mod_dir, das den Browser extern umleitet, ist das interne Rewrite für den Browser unsichtbar. Die nächste Regel führt dann das api-Routing aus, und aufgrund der ersten Regel wird garantiert, dass es einen abschließenden Schrägstrich gibt.

+0

Ist dies die einzige Möglichkeit, die Umleitung zu vermeiden, während das Modul aktiviert ist? – m59

+0

Ist es auch für gemeinsam genutzte Hosts üblich, diese Änderung zuzulassen? Ich habe festgestellt, dass sie in bestimmten Dingen streng sind. – m59

+1

@ m59 Es gibt keine Möglichkeit, die Weiterleitung zu vermeiden, während das 'DirectorySlash' von mod_dir aktiviert ist. Sie können die Umleitung vermeiden, indem Sie sie ausschalten, aber mod_dir verarbeitet den URI vor mod_rewrite (fast immer), so dass es keinen Weg gibt. Ich weiß jetzt nicht, wie strikt Hosting-Dienste darüber sind. Aber 'DirectorySlash' ist Teil der" Indexes "-Überschreibung, also ist es wahrscheinlich, dass sie dies zulassen. –

0

Wenn Sie nicht die von Jon Lin zur Verfügung gestellte Lösung verwenden möchten (indem Sie alle URLs neu konfigurieren, die auf Verzeichnisse verweisen), könnten Sie den folgenden Code verwenden (beachten Sie das? Im regulären Ausdruck - es besagt, dass der nachfolgende Schrägstrich nach " api "ist optional). Ich habe es nicht getestet, aber es sollte funktionieren, wie es ist:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/?(.*)$ api/index.php [L] 
+0

Ich habe genau das versucht. Der optionale Schrägstrich hilft nicht, noch entfernt der Schrägstrich ganz um sicher zu sein. – m59

+0

Ich bin mir ziemlich sicher, dass das nicht funktioniert, weil das Modul startet und weiterleitet, bevor das Neuschreiben eine Chance hat, es zu beheben. – m59

+0

@ m59 Ich denke, der Grund, warum Sie danach umgeleitet wurden, liegt darin, dass Ihr Browser die 301-Antwort zwischengespeichert hat, sodass er automatisch mit einem Schrägstrich an die URL weitergeleitet wurde. Sie sollten in curl oder einem neuen Browser testen –

Verwandte Themen