Umleiten, URLs ändern oder HTTP auf HTTPS in Apache umleiten - Alles, was Sie schon immer über mod_rewrite-Regeln wissen wollten, aber nie zu fragen wagten

Umleiten, URLs ändern oder HTTP auf HTTPS in Apache umleiten - Alles, was Sie schon immer über mod_rewrite-Regeln wissen wollten, aber nie zu fragen wagten

Das ist einKanonische Frageüber Apaches mod_rewrite.

Das Ändern einer Anforderungs-URL oder das Umleiten von Benutzern zu einer anderen als der ursprünglich angeforderten URL erfolgt mit mod_rewrite. Dazu gehören beispielsweise:

  • Ändern von HTTP in HTTPS (oder umgekehrt)
  • Ändern einer Anforderung für eine nicht mehr vorhandene Seite in einen neuen Ersatz.
  • Ändern eines URL-Formats (z. B. ?id=3433 in /id/3433)
  • Je nach Browser, Referrer oder allem, was unter Mond und Sonne möglich ist, wird eine andere Seite angezeigt.
  • Alles, was Sie mit URLs herumspielen möchten

Alles, was Sie schon immer über Mod_Rewrite-Regeln wissen wollten, aber nie zu fragen wagten!

Wie kann ich ein Experte im Schreiben von Mod_Rewrite-Regeln werden?

  • Was ist das grundlegende Format und die Struktur der Mod_rewrite-Regeln?
  • Welche Form/Variante von regulären Ausdrücken muss ich gut beherrschen?
  • Was sind die häufigsten Fehler/Fallstricke beim Schreiben von Umschreiberegeln?
  • Was ist eine gute Methode zum Testen und Überprüfen von Mod_Rewrite-Regeln?
  • Gibt es SEO- oder Leistungsauswirkungen der Mod_Rewrite-Regeln, die ich kennen sollte?
  • Gibt es häufige Situationen, in denen mod_rewrite zwar das richtige Werkzeug für die Aufgabe zu sein scheint, es aber nicht ist?
  • Was sind einige gängige Beispiele?

Ein Ort zum Testen Ihrer Regeln

Derhtaccess-TesterDie Website ist ein großartiger Ort, um mit Ihren Regeln herumzuspielen und sie zu testen. Sie zeigt sogar die Debug-Ausgabe an, sodass Sie sehen können, was übereinstimmte und was nicht.

Antwort1

Syntaxreihenfolge von mod_rewrite

mod_rewrite hat einige spezielle Ordnungsregeln, die die Verarbeitung beeinflussen. Bevor irgendetwas getan wird, RewriteEngine Onmuss die Direktive angegeben werden, da dies die mod_rewrite-Verarbeitung einschaltet. Dies sollte vor allen anderen Rewrite-Direktiven erfolgen.

RewriteCondvorhergehende RewriteRulemacht diese EINE Regel der Bedingung unterworfen. Alle folgenden RewriteRules werden verarbeitet, als ob sie keiner Bedingung unterworfen wären.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

In diesem einfachen Fall, wenn der HTTP-Referrer von serverfault.com stammt, leiten Sie Blog-Anfragen auf spezielle Serverfault-Seiten um (wir sind einfach so speziell). Wenn der obige Block jedoch eine zusätzliche RewriteRule-Zeile hätte:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

Alle .jpg-Dateien würden auf die speziellen Serverfault-Seiten gehen, nicht nur die mit einem Referrer, der darauf hinweist, dass sie von hier kamen. Das ist eindeutig nicht die Absicht, wie diese Regeln geschrieben sind. Es könnte mit mehreren RewriteCond-Regeln erreicht werden:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Dies sollte aber wahrscheinlich mit einer etwas schwierigeren Ersetzungssyntax erfolgen.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

Die komplexere RewriteRule enthält die Bedingungen für die Verarbeitung. Die letzte Klammer weist RewriteRule an, entweder oder (html|jpg)zu suchen und die gefundene Zeichenfolge in der neu geschriebenen Zeichenfolge als $2 darzustellen. Dies ist logisch identisch mit dem vorherigen Block mit zwei RewriteCond/RewriteRule-Paaren, es erfolgt nur in zwei Zeilen statt in vier.htmljpg

Mehrere RewriteCond-Zeilen werden implizit mit UND verknüpft und können explizit mit ODER verknüpft werden. So verarbeiten Sie Referrer sowohl von ServerFault als auch von Super User (explizites ODER):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

So stellen Sie von ServerFault referenzierte Seiten mit Chrome-Browsern bereit (implizites UND):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBaseist auch reihenfolgespezifisch, da es angibt, wie nachfolgende RewriteRuleAnweisungen ihre Verarbeitung handhaben. Es ist sehr nützlich in .htaccess-Dateien. Wenn es verwendet wird, sollte es die erste Anweisung unter „RewriteEngine on“ in einer .htaccess-Datei sein. Nehmen Sie dieses Beispiel:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Dies teilt mod_rewrite mit, dass die URL, die es gerade verarbeitet, überhttp://example.com/blog/anstelle des physischen Verzeichnispfads (/home/$Username/public_html/blog) und entsprechend zu behandeln. Aus diesem Grund RewriteRulegeht der davon aus, dass der String-Start nach dem "/blog" in der URL liegt. Hier ist dasselbe auf zwei verschiedene Arten geschrieben. Eine mit RewriteBase, die andere ohne:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

Wie Sie sehen, RewriteBaseermöglicht Rewrite-Regeln die Nutzung des Web-WebsitePfad zum Inhalt statt zum Web-Server, wodurch sie für diejenigen, die solche Dateien bearbeiten, verständlicher werden. Außerdem können sie die Anweisungen kürzer machen, was ästhetisch ansprechender ist.


RewriteRule-Übereinstimmungssyntax

RewriteRule selbst hat eine komplexe Syntax für übereinstimmende Zeichenfolgen. Ich werde die Flags (Dinge wie [PT]) in einem anderen Abschnitt behandeln. Da Sysadmins häufiger durch Beispiele lernen als durch das Lesen einesman-SeiteIch werde Beispiele geben und erklären, was sie tun.

RewriteRule ^/blog/(.*)$    /newblog/$1

Die .*Konstruktion gleicht jedes einzelne Zeichen ( .) null- oder mehrmals ab ( *). Die Klammern geben an, dass die Zeichenfolge zurückgegeben werden soll, die als Variable $1 abgeglichen wurde.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

In diesem Fall war das erste .* NICHT in Klammern eingeschlossen und wird daher in der umgeschriebenen Zeichenfolge nicht bereitgestellt. Diese Regel entfernt eine Verzeichnisebene auf der neuen Blog-Site. (/blog/2009/sample.html wird zu /newblog/sample.html).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

In diesem Fall richtet der erste Klammerausdruck eine passende Gruppe ein. Dies wird zu $1, das nicht benötigt wird und daher in der umgeschriebenen Zeichenfolge nicht verwendet wird.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

In diesem Fall verwenden wir $1 in der umgeschriebenen Zeichenfolge.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

Diese Regel verwendet eine spezielle Klammernsyntax, die ein Zeichen angibtReichweite. [0-9] entspricht den Ziffern 0 bis 9. Diese spezielle Regel gilt für die Jahre von 2000 bis 2099.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

Dies bewirkt dasselbe wie die vorherige Regel, aber der Teil {2} weist darauf hin, dass das vorherige Zeichen (in diesem Fall ein Klammerausdruck) zweimal übereinstimmen soll.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

In diesem Fall wird jeder Kleinbuchstabe im zweiten übereinstimmenden Ausdruck abgeglichen, und zwar für so viele Zeichen wie möglich. Die \.Konstruktion weist an, den Punkt als tatsächlichen Punkt zu behandeln und nicht als Sonderzeichen, das er in den vorherigen Beispielen ist. Es wird jedoch abgebrochen, wenn der Dateiname Bindestriche enthält.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

Dies fängt Dateinamen mit Bindestrichen ab. Da es sich jedoch -um ein Sonderzeichen in Klammerausdrücken handelt, muss es dasErsteZeichen im Ausdruck.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Diese Version fängt alle Dateinamen mit Buchstaben, Zahlen oder dem -Zeichen im Dateinamen ab. So geben Sie mehrere Zeichensätze in einem Klammerausdruck an.


RewriteRule-Flags

Die Flags der Umschreibregeln haben eine Vielzahl von speziellen Bedeutungen und Anwendungsfällen.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

Das Flag steht [L]am Ende des obigen Ausdrucks. Es können mehrere Flags verwendet werden, getrennt durch ein Komma. Die verlinkte Dokumentation beschreibt jedes Flag, aber hier sind sie trotzdem:

M= Letzte. Beenden Sie die Verarbeitung der RewriteRules, sobald diese übereinstimmt. Die Reihenfolge zählt!
C= Kette. Fahren Sie mit der Verarbeitung der nächsten RewriteRule fort. Wenn diese Regel nicht zutrifft, wird die nächste Regel nicht ausgeführt. Mehr dazu später.
E= Umgebungsvariable festlegen. Apache verfügt über verschiedene Umgebungsvariablen, die das Verhalten des Webservers beeinflussen können.
F= Verboten. Gibt einen 403-Forbidden-Fehler zurück, wenn diese Regel zutrifft.
G= Weg. Gibt einen 410-Gone-Fehler zurück, wenn diese Regel zutrifft.
H= Handler. Erzwingt, dass die Anforderung so behandelt wird, als ob es sich um den angegebenen MIME-Typ handeln würde.
N= Weiter. Erzwingt, dass die Regel von vorne beginnt und erneut abgeglichen wird. VORSICHT! Es können Schleifen entstehen.
NC= Kein Fall. Ermöglicht jpgdie Übereinstimmung sowohl mit JPG als auch mit JPG.
FR= Kein Escape. Verhindert das Umschreiben von Sonderzeichen (. ? # & usw.) in ihre Hex-Code-Äquivalente.
ES= Keine Unteranfragen. Wenn Sie Server-Side-Includes verwenden, verhindert dies Übereinstimmungen mit den eingeschlossenen Dateien.
P= Proxy. Erzwingt, dass die Regel von mod_proxy verarbeitet wird. Bietet transparent Inhalte von anderen Servern, da Ihr Webserver diese abruft und erneut bereitstellt. Dies ist ein gefährliches Flag, da ein schlecht geschriebenes Flag Ihren Webserver in einen offenen Proxy verwandelt und das ist schlecht.
PT= Durchgehen. Berücksichtigen Sie Alias-Anweisungen beim RewriteRule-Abgleich.
QSA= QSAppend. Wenn die ursprüngliche Zeichenfolge eine Abfrage enthält (http://example.com/thing?asp=foo) hängt die ursprüngliche Abfragezeichenfolge an die neu geschriebene Zeichenfolge an. Normalerweise würde sie verworfen. Wichtig für dynamische Inhalte.
R= Umleitung. Bietet eine HTTP-Umleitung zur angegebenen URL. Kann auch den genauen Umleitungscode [R=303] angeben. Sehr ähnlich zu RedirectMatch, was schneller ist und nach Möglichkeit verwendet werden sollte.
S= Überspringen. Überspringen Sie diese Regel.
T= Typ. Geben Sie den MIME-Typ des zurückgegebenen Inhalts an. Sehr ähnlich der AddTypeDirektive.

Wissen Sie noch, dass ich gesagt habe, dass dies RewriteCondnur für eine einzige Regel gilt? Nun, das können Sie umgehen, indem Sie eine Verkettung durchführen.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

Da die erste RewriteRule das Chain-Flag hat, wird die zweite Rewrite-Regel ausgeführt, wenn die erste ausgeführt wird, also wenn die vorherige RewriteCond-Regel zutrifft. Praktisch, wenn Ihnen Apache-Regular-Ausdrücke Kopfschmerzen bereiten. Aus Optimierungssicht ist die All-in-One-Line-Methode, auf die ich im ersten Abschnitt verweise, jedoch schneller.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

Dies kann durch Flags vereinfacht werden:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

Darüber hinaus gelten einige Flags auch für RewriteCond. Insbesondere NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

Stimmt mit „ServerFault.com“ überein

Antwort2

Was ist das grundlegende Format und die Struktur der Mod_rewrite-Regeln?

Ich verweise in diesen Punkten auf die hervorragende Antwort von sysadmin1138.

Welche Form/Variante von regulären Ausdrücken muss ich gut beherrschen?

Zusätzlich zur Syntaxreihenfolge, Syntaxübereinstimmung/regulären Ausdrücken und den RewriteRule-Flags, die von sysadmin1138 umrissen werden, halte ich es für erwähnenswert, dass mod_rewrite Apache-Umgebungsvariablen basierend auf HTTP-Anforderungsheadern und der Apache-Konfiguration verfügbar macht.

ich würde empfehlenAskApaches mod_rewrite Debug-Tutorialfür eine umfassende Liste der Variablen, die für mod_rewrite verfügbar sein können.

Was sind die häufigsten Fehler/Fallstricke beim Schreiben von Umschreiberegeln?

Die meisten Probleme mit RewriteRule sind auf ein Missverständnis der PCRE-Syntax, das fehlerhafte Maskieren von Sonderzeichen oder einen Mangel an Einblick in den Inhalt der für die Übereinstimmung verwendeten Variablen zurückzuführen.

Typische Probleme und empfohlene Fehlerbehebung:

  • 500 – Interner Serverfehler-Entfernen Sie die Windows-WagensteuerungStellen Sie in den Konfigurationsdateien, falls vorhanden, sicher, dass mod_rewrite aktiviert ist (umschließen Sie die Anweisungen inIfModuleBedingung, um dieses Szenario zu vermeiden), überprüfen Sie die Syntax der Direktive, kommentieren Sie die Direktiven aus, bis das Problem identifiziert ist
  • Umleitungsschleife- Nutzen Sie RewriteLog und RewriteLogLevel und kommentieren Sie Anweisungen aus, bis das Problem identifiziert ist

Was ist eine gute Methode zum Testen und Überprüfen von Mod_Rewrite-Regeln?

Sehen Sie sich zunächst den Inhalt der Umgebungsvariablen an, mit denen Sie einen Abgleich durchführen möchten. Wenn Sie PHP installiert haben, müssen Sie dazu nur den folgenden Block zu Ihrer Anwendung hinzufügen:

<?php
  var_dump($_SERVER);
?>

... dann schreiben Sie Ihre Regeln (vorzugsweise zum Testen auf einem Entwicklungsserver) und notieren Sie sich alle inkonsistenten Übereinstimmungen oder Aktivitäten in Ihrem ApacheFehlerprotokollDatei.

Für komplexere Regeln verwenden Sie mod_rewrite'sRewriteLogAnweisung zum Protokollieren von Aktivitäten in einer Datei und FestlegenRewriteLogLevel 3

Gibt es SEO- oder Leistungsauswirkungen der Mod_Rewrite-Regeln, die ich kennen sollte?

AllowOverride allwirkt sich auf die Serverleistung aus, da Apache .htaccessbei jeder Anforderung nach Dateien suchen und Anweisungen analysieren muss. Behalten Sie wenn möglich alle Anweisungen in der VirtualHost-Konfiguration für Ihre Site bei oder aktivieren Sie .htaccessOverrides nur für die Verzeichnisse, die sie benötigen.

GooglesRichtlinien für WebmasterGeben Sie ausdrücklich an: „Täuschen Sie Ihre Benutzer nicht und präsentieren Sie Suchmaschinen nicht andere Inhalte als den, den Sie den Benutzern anzeigen. Dies wird allgemein als „Cloaking“ bezeichnet.“ – Vermeiden Sie die Erstellung von mod_rewrite-Direktiven, die nach Suchmaschinen-Robots filtern.

Suchmaschinenroboter bevorzugen eine 1:1-Zuordnung von Inhalt:URI (dies ist die Grundlage für die Rangfolge von Links zu Inhalten). Wenn Sie mod_rewrite verwenden, um temporäre Weiterleitungen zu erstellen, oder wenn Sie denselben Inhalt unter mehreren URIs bereitstellen, sollten Sie die Angabe eineskanonische URIin Ihren HTML-Dokumenten.

Gibt es häufige Situationen, in denen mod_rewrite zwar das richtige Werkzeug für die Aufgabe zu sein scheint, es aber nicht ist?

Dies ist an sich schon ein umfangreiches (und potenziell kontroverses) Thema. Besser (meiner Meinung nach) ist es, die Verwendungsmöglichkeiten von Fall zu Fall zu behandeln und die Fragesteller entscheiden zu lassen, ob die vorgeschlagenen Lösungen ihren Anforderungen entsprechen.

Was sind einige gängige Beispiele?

AskApaches mod_rewrite Tricks und Tippsdeckt praktisch jeden üblichen Anwendungsfall ab, der regelmäßig auftaucht. Die „richtige“ Lösung für einen bestimmten Benutzer kann jedoch von der Komplexität der Konfiguration des Benutzers und den vorhandenen Anweisungen abhängen (weshalb es im Allgemeinen eine gute Idee ist, zu prüfen, welcheandereAnweisungen, die ein Benutzer immer dann zur Hand hat, wenn eine Frage zu mod_rewrite auftaucht).

Antwort3

Wie viele Administratoren/Entwickler kämpfe ich seit Jahren mit den Feinheiten der Umschreiberegeln und bin mit der vorhandenen Apache-Dokumentation unzufrieden. Daher habe ich mich entschlossen, in einem persönlichen Projekt herauszufinden, wie Apache mod_rewritetatsächlich funktioniert und mit dem Rest des Apache-Kerns interagiert. In den letzten Monaten habe ich daher Testfälle instrumentiert und mich stracein den Quellcode vertieft, um das alles in den Griff zu bekommen.

Hier sind einige wichtige Anmerkungen, die Entwickler von Umschreibregeln berücksichtigen sollten:

  • Einige Aspekte des Umschreibens sind für die Serverkonfiguration, den virtuellen Host, das Verzeichnis und die .htaccess-Verarbeitung üblichJedoch
  • Einige Verarbeitungsvorgänge unterscheiden sich bei der Root-Konfiguration (Serverkonfiguration, virtueller Host und Verzeichnis) erheblich von der PerDir( .htaccess)-Verarbeitung.
  • Schlimmer noch, weil die PerDir-Verarbeitung fast wahllos INTERNAL REDIRECT-Zyklen auslösen kann. Die Stammkonfigurationselemente müssen daher so geschrieben werden, dass sie sich darüber im Klaren sind, dass eine solche PerDir-Verarbeitung dies auslösen kann.

Ich würde sogar so weit gehen und sagen, dass man aus diesem Grund die Rewrite-Benutzer-Communitys fast in zwei Kategorien aufteilen und diese als völlig getrennt behandeln muss:

  • Diejenigen mit Root-Zugriff auf die Apache-Konfiguration. Dabei handelt es sich in der Regel um Administratoren/Entwickler mit einem dedizierten Anwendungsserver/einer dedizierten VM, und die Botschaft hier ist ganz einfach: Vermeiden Sie .htaccessnach Möglichkeit die Verwendung von Dateien; erledigen Sie alles in Ihrer Server- oder Vhost-Konfiguration. Das Debuggen ist relativ einfach, da der Entwickler das Debuggen festlegen und auf die rewrite.log-Dateien zugreifen kann.

  • Benutzer eines gemeinsam gehosteten Dienstes (Shared Hosted Service, SHS).

    • Solche Benutzerhaben/Perdir-Verarbeitung zu verwenden .htaccess, da keine Alternative verfügbar ist.
    • Schlimmer noch, das Kenntnisniveau solcher Benutzer (was die Verwendung der durch reguläre Ausdrücke gesteuerten Ladder-Logik von mod_rewrite betrifft) ist im Allgemeinen erheblich geringer als das erfahrener Administratoren.
    • Apache und die Hosting-Anbieter bieten keinen Debugging-/Diagnose-Support. Die einzigen Diagnoseinformationen sind eine erfolgreiche Umleitung, eine Umleitung zur falschen URI oder ein 404/500-Statuscode. Das verwirrt und macht den Benutzer hilflos.
    • Apache erklärt nur sehr dürftig, wie das Umschreiben in diesem Anwendungsfall funktioniert. Es wird beispielsweise nicht klar erklärt, welche PerDir- .htaccessDatei ausgewählt wird und warum. Es werden auch nicht die Feinheiten des PerDir-Zyklus erklärt und wie man diesen vermeiden kann.

Möglicherweise gibt es noch eine dritte Gemeinschaft: Verwaltungs- und Supportmitarbeiter bei SHS-Anbietern, die in beiden Lagern stehen und die oben genannten Konsequenzen erleiden müssen.

Ich habe ein paar Blogbeiträge im Artikelstil geschrieben (z. B.Weitere Informationen zur Verwendung von Rewrite-Regeln in .htaccess-Dateien), das viele detaillierte Punkte abdeckt, die ich hier nicht wiederholen werde, um diesen Beitrag kurz zu halten. Ich habe meinen eigenen Shared Service und unterstütze auch einige dedizierte & VM FLOSS-Projekte. Ich habe mit einer Standard-LAMP-VM als Testvehikel für meinen SHS-Account begonnen, aber am Ende fand ich es besser, eine richtige Spiegel-VM zu verwenden (beschriebenHier).

Im Hinblick darauf, wie die Administrator-Community .htaccessdie Benutzer unterstützen sollte, bin ich jedoch der Meinung, dass wir Folgendes entwickeln und anbieten müssen:

  • Eine zusammenhängende Beschreibung der tatsächlichen Funktionsweise des Rewrite-Systems bei der PerDir-Verarbeitung
  • Eine Reihe von Richtlinien/Best Practices zum Schreiben .htaccessvon Umschreibregeln
  • Ein einfacher webbasierter Rewrite-Script-Parser, der den W3C-HTML-Parsern ähnelt, mit dem Benutzer jedoch Test-URIs oder Test-Vektoren derselben eingeben und sofort ein Protokoll des Rewrite-Logikflusses erhalten können.
  • Hinweise, wie Sie integrierte Diagnosefunktionen aus Ihren Regeln erhalten (z. B.

    • Nutzen Sie [E=VAR:EXPR]die Tatsache aus, dass EXPRRückverweise ($N oder %N) erweitert werden, um sie als Diagnose für das Zielskript verfügbar zu machen.
    • Wenn Sie Ihre Umschreiberegeln thematisch mit den Flags [OR],[C],[SKIP] und [L] anordnen, so dass das gesamte Umschreibeschema funktioniertohnedie Notwendigkeit, eine interne Umleitung auszunutzen, dann können Sie Folgendes als Regel 1 hinzufügen, um allen Schleifenaufwand zu vermeiden:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

Antwort4

Was sind die häufigsten Fehler/Fallstricke beim Schreiben von Umschreiberegeln?

Eine wirklich einfache Falle ist, wenn Sie URLs umschreiben, die den scheinbaren Pfad ändern, z. B. von /base/1234/index.htmlnach /base/script.php?id=1234. Alle Bilder oder CSS mit relativen Pfaden zum Skriptspeicherort werden vom Client nicht gefunden. Eine Reihe von Optionen zur Lösung dieses Problems finden Sie unterdiese FAQ.

verwandte Informationen