2009-07-22 5 views
15

Ich versuche RewriteRules in .htaccess mit relativen Pfaden zu verwenden, aber Apache scheint den physischen Pfad anstelle des Server Pfades zum Ausgang zu wollen, wenn ich für die Ausgabe eines relativen Pfad versuchen. Absolute und Server-Root-Pfade funktionieren einwandfrei. Zum Beispiel:Warum deckt Apache's RewriteRule lokale Pfade auf?

RewriteEngine On 

# this works fine, 127.0.0.1/ab redirects to 127.0.0.1/cd 
RewriteRule ^ab$ /cd [R] 

# this doesn't work... 127.0.0.1/wx redirects to 127.0.0.1/C:/path/to/files/yz 
RewriteRule ^wx$ yz [R] 

ein „RewriteBase /“ löst das Problem Hinzufügen, aber es ist mühsam den Weg zu jedem .htaccess hinzuzufügen, und es macht es schwieriger, die Verzeichnisstruktur zu ändern. Gibt es einen Grund, warum RewriteBase standardmäßig auf den aktuellen physischen Pfad anstelle des aktuellen URI Pfads zurückgreift?

Antwort

5

Es ist wegen der [R], was bedeutet, dass der Server auf den neuen Pfad umleiten wird (so dass der Browser des Benutzers eine neue Anforderung mit der neu gesendeten uri ausgibt), statt intern den URI in einen lokalen Pfad zu übersetzen.

In Ihrer ersten RewriteRule gibt es einen Schrägstrich im neuen Pfad, daher versucht der Server nicht, ihn in den lokalen Pfad zu übersetzen, aber in der zweiten Regel gibt es keinen Schrägstrich, deshalb wird er umgeleitet ein vollständiger lokaler Pfad Dies erklärt auch, warum es mit dem RewriteBase-Set funktioniert.

Entweder entfernen Sie die [R] (Sie können es durch ein [L] in Ihrem Fall ersetzen, dies vermeidet, dass der Server versucht, andere Regeln zu finden, wenn es eine passende gefunden hat), oder fügen Sie einen Schrägstrich vor "yz" ein deine zweite RewriteRule.

Ich würde vorschlagen, das [R] einfach durch ein [L] zu ersetzen: Auf diese Weise sieht der Benutzer den neu geschriebenen Pfad nicht, was RewriteRules generell tun soll (hauptsächlich für SEO-Zwecke), es sei denn Sie möchten Ihre Benutzer speziell auf eine neue URL umleiten.

+0

Ich möchte eine tatsächliche Umleitung auf den neuen Pfad - ich verwende dies zum Erstellen von Verknüpfungen URLs und korrigieren Tippfehler. Gibt es eine Möglichkeit, die manuelle Einstellung von RewriteBase in jeder .htaccess-Datei zu vermeiden? – zildjohn01

+0

Im Allgemeinen müssen Sie die 'RewriteBase' nicht ändern. Verwenden Sie nur relative Pfade für interne und absolute Pfade für externe Weiterleitungen. – Gumbo

+1

Könnten Sie bitte erläutern, was Sie meinen? In meinem Code habe ich einen relativen Pfad für eine interne Weiterleitung verwendet, und es endete mit dem unerwünschten Verhalten, das ich beschrieben habe. – zildjohn01

12

Für diejenigen, die hier von Google kommen passieren (wie mich), die kurze Checkliste:

  • Sie RewriteBase / Stellen Sie sicher, haben (oder einen anderen Wert - ist die Aussage, was wichtig ist)

  • Wenn Sie Umleitung nutzen ([R], [R=30x], etc) - sicherstellen, dass die neue URI beginnt mit einem / und enthält einen Pfad relativ zu Ihrer Domain-root

  • (Wenn oben noch nicht helfen) Starten Sie Apache neu, löschen Sie den Cache Ihres Browsers

Das ist, was meinen Tag gerettet (vor allem, wenn Sie [R=301] zu einem gewissen Punkt haben), vielleicht wird es bei Ihnen zu speichern.

+0

Ja. Half mir. –

+0

rewritebase/geholfen. Vielen Dank – OzzyTheGiant

0

Versuchen Sie dies und sagen Sie mir, das Ergebnis:
# dies nicht funktioniert ... 127.0.0.1/wx Umleitungen an 127.0.0.1/C:/path/to/files/yz

RewriteRule^wx $/yz [R]

setzen/vor yz.