Frage Redirect, URLs ändern oder HTTP auf HTTPS in Apache umleiten - Alles, was Sie jemals über Mod_Rewrite-Regeln wissen wollten, aber nicht zu fragen wagten


Das ist ein Kanonische Frage über Apache mod_rewrite.

Das Ändern einer Anforderungs-URL oder das Umleiten von Benutzern auf eine andere als die ursprünglich angeforderte URL erfolgt mit mod_rewrite. Dies beinhaltet Dinge wie:

  • Ändern von HTTP zu HTTPS (oder umgekehrt)
  • Ändern einer Anfrage auf eine Seite, die nicht mehr existiert, zu einer neuen Ersetzung.
  • Ändern eines URL-Formats (z. B.? Id = 3433 nach / id / 3433)
  • Präsentieren einer anderen Seite basierend auf dem Browser, basierend auf dem Referrer, basierend auf allem, was unter Mond und Sonne möglich ist.
  • Alles, was Sie mit der URL umgehen möchten

Alles, was Sie jemals über Mod_Rewrite-Regeln wissen wollten, aber nicht zu fragen wagten!

Wie kann ich Experte beim Schreiben von mod_rewrite-Regeln werden?

  • Was ist das grundlegende Format und die Struktur von mod_rewrite-Regeln?
  • Welche Form / Geschmack von regulären Ausdrücken muss ich gut verstehen?
  • Was sind die häufigsten Fehler beim Schreiben von Rewrite-Regeln?
  • Was ist eine gute Methode zum Testen und Überprüfen von mod_rewrite-Regeln?
  • Gibt es SEO- oder Performance-Implikationen von mod_rewrite-Regeln, auf die ich achten sollte?
  • Gibt es häufige Situationen, in denen mod_rewrite das richtige Werkzeug für den Job ist, aber nicht?
  • Was sind einige gängige Beispiele?

Ein Ort, um deine Regeln zu testen

Das htaccess Tester Website ist ein großartiger Ort, um mit Ihren Regeln zu spielen und sie zu testen. Es zeigt sogar die Debug-Ausgabe, so dass Sie sehen können, was zusammenpasst und was nicht.


257
2017-12-20 16:59


Ursprung


Die Idee hinter dieser Frage ist es, den endlosen mod_rewrite-Fragen einen engen Weg zu geben, die unsere regelmäßigeren Benutzer verrückt machen. Dies ist sehr ähnlich wie bei Subnetting bei serverfault.com/questions/49765/how-does-subnetting-work . - Kyle Brandt♦
Außerdem möchte ich nicht zu viele Upvotes dazu Frageeher sollten sie zur Antwort gehen. Ich will das nicht, weil ich sicherstellen will, dass das Poster volle Anerkennung für das bekommt, was ich hoffe mod_rewrite answer um alle mod_rewrite Fragen zu beenden. - Kyle Brandt♦
Entschuldigung, ich habe die Frage geupdated. ;-) Ich glaube wirklich, dass es an (oder nahe) dem oberen Rand von erscheinen muss mod-rewrite Tag sucht / filtert. - Steven Monday
Someone Else (tm) sollte die üblichen Anwendungsfälle behandeln. Ich kenne sie nicht gut genug, um es gerecht zu werden. - sysadmin1138♦
Vielleicht sollte diese Frage in das Mod-Rewrite-Tag-Wiki eingebunden werden, um den Pfad noch kürzer zu machen. - beldaz


Antworten:


mod_rewrite Syntax Reihenfolge

mod_rewrite hat einige spezifische Regeln, die sich auf die Verarbeitung auswirken. Bevor etwas getan wird, die RewriteEngine On Direktive muss angegeben werden, da dies die Mod_rewrite-Verarbeitung aktiviert. Dies sollte vor allen anderen Rewrite-Anweisungen stehen.

RewriteCond vor RewriteRule macht diese eine Regel abhängig von der Bedingung. Alle folgenden RewriteRules werden so verarbeitet, als ob sie keinen Bedingungen unterliegen.

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, bloggen Sie Blog-Anfragen auf spezielle Serverfail-Seiten um (wir sind nur so speziell). Wenn der obige Block jedoch eine zusätzliche RewriteRule-Zeile hatte:

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 Verweis, der darauf hinweist, dass es von hier kam. Dies ist eindeutig nicht die Absicht, wie diese Regeln geschrieben werden. Es könnte mit mehreren RewriteCond-Regeln gemacht 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

Aber wahrscheinlich sollte mit etwas komplizierter Ersatz Syntax getan werden.

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, (html|jpg) teilt RewriteRule mit, dass es mit beiden übereinstimmt html oder jpg, und die übereinstimmende Zeichenfolge als $ 2 in der neu geschriebenen Zeichenfolge darzustellen. Dies ist logisch identisch mit dem vorherigen Block, mit zwei RewriteCond / RewriteRule-Paaren, es tut es nur auf zwei Zeilen statt vier.

Mehrere RewriteCond-Zeilen werden implizit UND-verknüpft und können explizit ODER-verknüpft werden. Um Referrer von ServerFault und Super User zu behandeln (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

Um ServerFault-bezogene Seiten mit Chrome-Browsern zu versorgen (implizites UND):

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

RewriteBase ist auch auftragsspezifisch, da es folgendes angibt RewriteRule Anweisungen behandeln ihre Verarbeitung. 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. Nimm dieses Beispiel:

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

Das sagt mod_rewrite, dass diese bestimmte URL, mit der es gerade arbeitet, über die URL angekommen ist http://example.com/blog/ anstelle des physischen Verzeichnispfads (/ home / $ Benutzername / public_html / blog) und entsprechend zu behandeln. Aus diesem Grund, die RewriteRule hält es für einen String-Start nach dem "/ Blog" in der URL zu sein. Hier ist das Gleiche, zwei verschiedene Wege geschrieben. Eins mit RewriteBase, das 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 du siehst, RewriteBase erlaubt Rewrite-Regeln, die Web-Seite? ˅ Weg zum Inhalt und nicht zum Web-Server, was sie für diejenigen, die solche Dateien bearbeiten, verständlicher macht. Außerdem können sie die Richtlinien verkürzen, was ästhetisch ansprechend ist.


RewriteRule-Übereinstimmungssyntax

RewriteRule selbst verfügt über eine komplexe Syntax zum Abgleichen von Strings. Ich werde die Flaggen (Dinge wie [PT]) in einem anderen Abschnitt abdecken. Weil Sysadmins häufiger lernen als beim Lesen eines Man-Seite Ich werde Beispiele geben und erklären, was sie tun.

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

Das .* Konstrukt passt auf jedes einzelne Zeichen (.) null oder mehrmals (*). Wenn Sie es in Klammern einschließen, wird die Zeichenfolge angegeben, die als $ 1-Variable übereinstimmte.

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

In diesem Fall wurde der erste. * NICHT in Parens eingeschlossen, so dass er nicht für die neu geschriebene Zeichenfolge bereitgestellt wird. Diese Regel entfernt eine Verzeichnisebene auf der neuen Blog-Site. (/blog/2009/sample.html wird /newblog/sample.html).

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

In diesem Fall richtet der erste Klammerausdruck eine übereinstimmende Gruppe ein. Dies wird $ 1, was nicht benötigt wird und daher nicht in der umgeschriebenen Zeichenkette verwendet wird.

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

In diesem Fall verwenden wir $ 1 in der neu geschriebenen Zeichenfolge.

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

Diese Regel verwendet eine spezielle Klammer-Syntax, die ein Zeichen angibt Angebot. [0-9] stimmt mit den Ziffern 0 bis 9 überein. Diese spezielle Regel behandelt Jahre von 2000 bis 2099.

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

Das macht dasselbe wie die vorherige Regel, aber der Teil {2} sagt ihm, dass es zweimal mit dem vorherigen Zeichen (in diesem Fall einem Klammerausdruck) übereinstimmen muss.

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. Das \. construct sagt ihm, dass er die Periode als eine tatsächliche Periode behandeln soll, nicht die Sonderzeichen, die in den vorherigen Beispielen vorkommen. Es wird jedoch zerbrechen, wenn der Dateiname Bindestriche enthält.

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

Dies fängt Dateinamen mit Bindestrichen in ihnen ein. Allerdings da - ist ein Sonderzeichen in Klammerausdrücken, es muss das sein zuerst Zeichen im Ausdruck.

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

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


RewriteRule-Flags

Die Flags in Rewrite-Regeln haben eine Vielzahl von speziellen Bedeutungen und Anwendungsfällen.

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

Die Flagge ist die [L] am Ende des obigen Ausdrucks. Mehrere Flags können verwendet werden, getrennt durch ein Komma. Die verlinkte Dokumentation beschreibt jede einzelne, aber hier sind sie trotzdem:

L = Letzte. Beenden Sie die Verarbeitung von RewriteRules, sobald diese übereinstimmt. Bestellung zählt!
C = Kette. Fahren Sie mit der Verarbeitung der nächsten RewriteRule fort. Wenn diese Regel nicht übereinstimmt, wird die nächste Regel nicht ausgeführt. Mehr dazu später.
E = Umgebungsvariable einstellen. 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 = Gegangen. Gibt einen 410-Gone-Fehler zurück, wenn diese Regel übereinstimmt.
H = Handler. Erzwingt, dass die Anforderung so behandelt wird, als wäre sie der angegebene MIME-Typ.
N = Weiter. Erzwingt, dass die Regel erneut beginnt und erneut übereinstimmt. ACHTUNG! Schleifen können resultieren.
NC = Kein Fall. Erlaubt jpg um sowohl JPG als auch JPG zu vergleichen.
NE = Kein Entkommen. Verhindert das Umschreiben von Sonderzeichen (.? # & Etc) in ihre Hex-Code-Entsprechungen.
NS = Keine Unteranfragen. Wenn Sie serverseitige Includes verwenden, werden Übereinstimmungen mit den enthaltenen Dateien verhindert.
P = Proxy. Erzwingt die Behandlung der Regel durch mod_proxy. Stellen Sie Inhalte transparent von anderen Servern bereit, da Ihr Webserver sie abruft und erneut bereitstellt. Dies ist eine gefährliche Flagge, da eine schlecht geschriebene Ihren Webserver in einen Open-Proxy verwandelt und das ist schlecht.
PT = Durchreichen. Berücksichtigen Sie Alias-Anweisungen im RewriteRule-Abgleich.
QSA = QSAppend. Wenn die ursprüngliche Zeichenfolge eine Abfrage enthält (http://example.com/thing?asp=foo) Hängen Sie die ursprüngliche Abfragezeichenfolge an die neu geschriebene Zeichenfolge an. Normalerweise würde es verworfen werden. Wichtig für dynamische Inhalte.
R = Umleiten. Stellen Sie eine HTTP-Weiterleitung für die angegebene URL bereit. Kann auch genauen Umleitungscode liefern [R = 303]. Sehr ähnlich zu RedirectMatch, das ist schneller und sollte wenn möglich verwendet werden.
S = Überspringen. Überspringe diese Regel.
T = Typ. Geben Sie den MIME-Typ des zurückgegebenen Inhalts an. Sehr ähnlich wie die AddType Richtlinie.

Du weißt wie ich das gesagt habe RewriteCond gilt für eine und nur eine Regel? Nun, Sie können das umgehen, indem Sie sich verketten.

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 RewriteRule die vorherige RewriteCond-Regel erfüllt. Handlich, wenn Apache-reguläre Ausdrücke Ihr Gehirn verletzen. Die All-In-One-Line-Methode, auf die ich im ersten Abschnitt hinweise, ist jedoch vom Standpunkt der Optimierung aus 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]

Einige Flags gelten auch für RewriteCond. Bemerkenswert, NoCase.

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

Wird "ServerFault.com" entsprechen


219
2017-12-20 17:44



Gut gemacht. [Füllstoff] - EEAA
Sehr schön mod_rewrite und Regex-Primer. +1. - Steven Monday
Es ist manchmal nützlich zu wissen, dass die RewriteCond wird tatsächlich verarbeitet nach dem das RewriteRule Ist abgestimmt. Vielleicht möchtest du später mehr darüber sagen, wenn du sagst: "RewriteCond previous RewriteRule macht diese EINE Regel abhängig von der Bedingung." Vielleicht möchten Sie erwähnen, dass es sich bei den Regexes um Perl-kompatible reguläre Ausdrücke handelt. Außerdem haben Sie einen überflüssigen Apostroph in "... die RewriteRule betrachtet es als String-Start ..." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 passt nicht zu den zuerst Verzeichniskomponente - rewriterules sind standardmäßig gierig. /.*/(.*) stimmt mit / 1 / (2) / und / 1/2/3/4/5 / (6) / überein, daher müssen Sie / [^ /] * / nur mit dem ersten Pfad übereinstimmen Komponente. - adaptr
@ sysadmin1138, Ich denke, diese Antwort ist gut, aber es kann besser sein, wenn Sie mehr auf die Flags E, N, NS, P, PT und S mit Beispielen, weil diese Flags nicht offensichtlich ist, wie sie arbeiten usw. - Pacerier


Was ist das grundlegende Format und   Struktur der Regeln von mod_rewrite?

Ich werde auf die ausgezeichnete Antwort von sysadmin1138 in diesen Punkten verzichten.

Welche Form / Geschmack von regelmäßig   Ausdrücke muss ich einen Körper haben   Verständnis für?

Zusätzlich zu der syntaktischen Reihenfolge, den syntaktischen Übereinstimmungen / regulären Ausdrücken und den RewriteRule-Flags, die von sysadmin1138 umrissen werden, glaube ich zu erwähnen, dass mod_rewrite Apache-Umgebungsvariablen basierend auf HTTP-Anforderungsheadern und der Apache-Konfiguration verfügbar macht.

ich würde empfehlen AskApaches mod_rewrite Debug Tutorial für eine umfassende Liste von Variablen, die für mod_rewrite verfügbar sein können.

Was sind die häufigsten?   Fehler / Fallstricke beim Umschreiben   Regeln?

Die meisten Probleme mit RewriteRules rühren von einem Missverständnis der PCRE-Syntax / dem Fehlverhalten von Sonderzeichen oder dem fehlenden Einblick in den Inhalt der Variablen her, die für das Matching verwendet werden.

Typische Probleme und empfohlene Fehlerbehebung:

  • 500 - Interner Serverfehler - Entfernen Sie Windows-Wagensteuerelemente Stellen Sie in den Konfigurationsdateien, falls vorhanden, sicher, dass mod_rewrite aktiviert ist (wrap Direktiven in IfModule Um dieses Szenario zu vermeiden, überprüfen Sie die Direktive, kommentieren Sie die Anweisungen, bis das Problem erkannt wurde
  • Umleitungsschleife - Verwenden Sie RewriteLog und RewriteLogLevel, um die Anweisungen zu kommentieren, bis das Problem erkannt wird

Was ist eine gute Methode zum Testen und   mod_rewrite-Regeln überprüfen?

Betrachten Sie zunächst den Inhalt der Umgebungsvariablen, mit denen Sie übereinstimmen wollen - wenn Sie PHP installiert haben, können Sie einfach den folgenden Block zu Ihrer Anwendung hinzufügen:

<?php
  var_dump($_SERVER);
?>

... schreiben Sie dann Ihre Regeln (vorzugsweise zum Testen auf einem Entwicklungsserver) und notieren Sie inkonsistente Übereinstimmungen oder Aktivitäten in Ihrem Apache Fehlerprotokoll Datei.

Verwenden Sie für komplexere Regeln mod_rewrite's RewriteLog Anweisung, um Aktivität in eine Datei zu protokollieren und festzulegen RewriteLogLevel 3

100 100 100 sch 100 sch 100 sch 100 100 100 100 100 sch 100 sch 100 100 100 sch 100 100 sch 100 100 zwischen sch dieser   Implikationen der mod_rewrite Regeln   Sollte sich bewusst sein?

AllowOverride all beeinträchtigt die Serverleistung, nach der Apache suchen muss .htaccess Dateien und Richtlinien analysieren mit jeder Anfrage - wenn möglich, behalten Sie alle Anweisungen in der VirtualHost-Konfiguration für Ihre Site oder aktivieren .htaccess überschreibt nur für die Verzeichnisse, die sie benötigen.

Google's Richtlinien für Webmaster ausdrücklich sagen: "Täuschen Sie Ihre Benutzer nicht oder präsentieren Sie den Suchmaschinen keinen anderen Inhalt, als den Benutzern angezeigt wird, was üblicherweise als" Cloaking "bezeichnet wird. - Vermeiden Sie das Erstellen von mod_rewrite-Anweisungen, die nach Suchmaschinenrobotern filtern.

Suchmaschinenroboter bevorzugen einen 1: 1-Inhalt: URI-Mapping (dies ist die Grundlage für das Ranking von Links zu Inhalten) - Wenn Sie mod_rewrite verwenden, um temporäre Weiterleitungen zu erstellen, oder wenn Sie den gleichen Inhalt unter mehreren URIs bereitstellen, sollten Sie a kanonische URI innerhalb Ihrer HTML-Dokumente.

Gibt es häufige Situationen, in denen   mod_rewrite scheint das Richtige zu sein   Werkzeug für den Job, aber nicht?

Dies ist ein riesiges (und möglicherweise umstrittenes) Thema an sich - besser (IMHO), um die Verwendungen von Fall zu Fall zu behandeln und die Fragesteller festzustellen, ob die vorgeschlagenen Lösungen ihren Bedürfnissen entsprechen.

Was sind einige gängige Beispiele?

AskApaches mod_rewrite Tricks und Tipps deckt fast jeden gängigen 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 Richtlinien abhängen (weshalb es im Allgemeinen eine gute Idee ist, welche zu finden) andere Anweisungen, die ein Benutzer hat, wenn eine mod_rewrite Frage auftaucht.


38
2017-12-21 01:00



Danke für den AskApache-Link. Es ist was ich gesucht habe! - sica07
Der AskApache Clown wird offiziell von der ASF nicht unterstützt. Vieles von dem, was er sagt, ist umstritten oder einfach falsch. - adaptr
@adaptr Bitte teilen Sie die überlegenen Ressourcen, die Ihnen offensichtlich bekannt sind. - danlefree
"häufige Situationen, in denen mod_rewrite das richtige Werkzeug für den Job ist, aber nicht?" - einfach Weiterleitungen, wo mod_rewrite nicht bereits verwendet wird. Benutze mod_alias Redirect oder RedirectMatch stattdessen. Siehe auch die Apache-Dokumentation: Wenn nicht mod_rewrite verwendet werden soll - MrWhite


Wie viele Admins / Entwickler habe ich mich jahrelang mit den komplizierten Rewrite-Regeln herumgeschlagen und bin mit der bestehenden Apache-Dokumentation unzufrieden. Daher entschied ich mich als ein persönliches Projekt, um zu verstehen, wie mod_rewrite funktioniert tatsächlich und interagiert mit dem Rest des Apache-Kerns, also habe ich in den letzten Monaten Testfälle mit instrumentiert strace + Drill in den Quellcode, um all dies in den Griff zu bekommen.

Hier sind einige Schlüsselkommentare, die Regelentwickler neu schreiben müssen:

  • Einige Aspekte des Neuschreibens sind bei der Serverkonfiguration, dem virtuellen Host, dem Verzeichnis und der .htaccess-Verarbeitung üblich jedoch
  • Einige Verarbeitungen unterscheiden sich stark von der Root-Konfiguration (Serverkonfiguration, virtueller Host und Verzeichnis) im Gegensatz zu PerDir (.htaccess) wird bearbeitet.
  • Schlimmer noch, weil die PerDir-Verarbeitung nahezu wahllos INTERNAL-REDIRECT-Zyklen auslösen kann, müssen die Root-Konfigurationselemente darauf hingewiesen werden, dass eine solche PerDir-Verarbeitung dies auslösen kann.

Ich würde so weit gehen, um zu sagen, dass Sie deshalb die Benutzergemeinschaften in zwei Kategorien aufteilen und sie als völlig getrennt behandeln müssen:

  • Diejenigen mit Root-Zugriff auf die Apache-Konfiguration. Dies sind in der Regel Admin / Entwickler mit einem dedizierten Anwendungsserver / VM, und die Nachricht hier ist ziemlich einfach: Vermeiden Sie die Verwendung .htaccess Dateien wenn möglich; Mach alles in deinem Server oder in der vhost config. Das Debuggen ist relativ einfach, da der Entwickler das Debugging einstellen kann und Zugriff auf die rewrite.log-Dateien hat.

  • Benutzer eines Shared Hosted Service (SHS).

    • Solche Benutzer haben benutzen .htaccess / Perdir-Verarbeitung, da keine Alternative verfügbar ist.
    • Schlimmer noch, das Qualifikationsniveau solcher Benutzer (soweit es die regexp-gesteuerte Ladder-Logik von mod_rewrite verwendet) ist im Allgemeinen wesentlich geringer als bei erfahrenen Administratoren.
    • Apache und die Hosting-Anbieter bieten keine Debugging / Diagnose-Unterstützung. Die einzige Diagnoseinformation ist eine erfolgreiche Umleitung, eine Umleitung auf den falschen URI. oder ein 404/500-Statuscode. Dies macht sie verwirrt und hilflos.
    • Apache ist extrem schwach und erklärt, wie das Umschreiben für diesen Anwendungsfall funktioniert. Zum Beispiel gibt es keine klare Erklärung für was PerDir .htaccessDatei ist ausgewählt und warum. Es erklärt nicht die Feinheiten von PerDir Radfahren und wie man dies vermeidet.

Es gibt möglicherweise eine dritte Gemeinschaft: Admin- und Support-Mitarbeiter in SHS-Anbietern, die in beiden Lagern Fuß fassen und unter den oben genannten Konsequenzen leiden müssen.

Ich habe ein paar Blogposts in Artikelform geschrieben (z. B. Weitere Informationen zur Verwendung von Regeln zum erneuten Schreiben in .htaccess-Dateien), die viele detaillierte Punkte enthält, die ich hier nicht wiederholen möchte, um diesen Beitrag kurz zu halten. Ich habe meinen eigenen Shared Service und unterstütze einige dedizierte & VM FLOSS Projekte. Ich begann mit einer Standard-LAMP-VM als Testvehikel für mein SHS-Konto, aber am Ende fand ich es besser, eine richtige Spiegel-VM zu machen (beschrieben) Hier).

In Bezug darauf, wie die Admin-Community unterstützen sollte .htaccess Ich glaube, dass wir entwickeln und anbieten müssen:

  • Eine zusammenhängende Beschreibung, wie das Umschreibsystem tatsächlich in der PerDir-Verarbeitung funktioniert
  • Eine Reihe von Richtlinien / Best Practices zum Schreiben .htaccess Regeln umschreiben
  • Ein einfacher webbasierter Rewrite-Skript-Parser, der den W3C-HTML-Parsern ähnlich ist, aber durch den Benutzer Test-URIs oder Testvektoren desselben eingeben und ein sofortiges Protokoll des Rewrite-Logikflusses erhalten können.
  • Hinweise, wie Sie integrierte Diagnosefunktionen aus Ihren Regeln erhalten (z.

    • Benutzen [E=VAR:EXPR] Ausnutzen der Tatsache, dass EXPR erweitert die Rückwärtsreferenzen ($ N oder% N), um sie dem Zielskript als Diagnose zur Verfügung zu stellen.
    • Wenn Sie Ihre Umschreibungsregeln mit den Flags [OR], [C], [SKIP] und [L] aktuell anordnen, damit das gesamte Umschreibeschema funktioniert ohne Wenn Sie die interne Umleitung ausnutzen möchten, können Sie als Regel 1 Folgendes hinzufügen, um den gesamten Aufwand zu vermeiden:

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

21
2018-01-14 16:50



Dies ist gut dokumentiert. Warum sagen Sie, dass die Dokumentation das nicht erklärt? - adaptr
Alles, was Sie tun müssen, ist das Abonnement der .htaccess Themen und Sie werden sehen. Die meisten Anfänger werden hoffnungslos verwirrt - die meisten von ihnen haben ihre erste Erfahrung mit einem LAMP-Dienst und mod_rewrite in einem gemeinsam genutzten Dienst und haben daher keinen Root-Zugriff auf die System / vhost-Konfigurationen und müssen per Dir-Verarbeitung durch .htaccessDateien. Es gibt wichtige Unterschiede, die der Anfänger "bluten" muss. Ich würde mich selbst als Power-User sehen und entdecke immer noch Feinheiten. Wie ich schon sagte, musste ich Strace- und Source-Code-Scans verwenden, um einige Aspekte auszuarbeiten. Sie sollten nicht benötigt werden. :-( - TerryE
Ich bin völlig einverstanden. "Wir müssen die Benutzergemeinschaften in zwei Kategorien aufteilen und sie als völlig getrennt behandeln." Einige Benutzer verwenden Shared Hosting und brauchen darauf vertrauen .htaccessDas ist furchtbar zerbrechlich, kompliziert und verwirrend, selbst für Experten. Ich habe immer noch Probleme. - Ryan


ReWriteMap verwenden

Es gibt viele Dinge, die Sie mit Re-writemaps machen können. Rewritemaps werden mit der RewriteMap-Direktive deklariert und können dann sowohl in RewritCond-Auswertungen als auch in RewriteRule-Subventionen verwendet werden.

Die allgemeine Syntax für RewriteMap lautet:

RewriteMap MapName MapType:MapSource

Zum Beispiel:

RewriteMap examplemap txt:/path/to/file/map.txt

Sie können dann den mapname für Konstrukte wie folgt verwenden:

${examplemap:key}

Die Karte enthält Schlüssel / Wert-Paare. Wenn der Schlüssel gefunden wird, wird der Wert ersetzt. Einfache Maps sind reine Textdateien, aber Sie können Hash-Maps und sogar SQL-Abfragen verwenden. Weitere Details finden Sie in den Dokumenten:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

Unscharfe Saiten.

Es gibt vier interne Karten, mit denen Sie einige Manipulationen vornehmen können. Besonders überflüssige Saiten können sich als nützlich erweisen.

Beispiel: Ich möchte den String "café" in der Abfragezeichenfolge testen. Der Browser wird jedoch entkommen, bevor er an meinen Server gesendet wird. Daher muss ich entweder herausfinden, welche Version der URL für jede Zeichenfolge, die ich zuordnen möchte, enthält, oder ich kann sie einfach unleserlich machen ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

Beachten Sie, wie ich mit einem RewriteCond nur das Argument für den Query-String-Parameter erfassen und dann die Map im zweiten rewriteCond verwenden kann, um das Argument zu entschlüsseln. Dies wird dann verglichen. Beachten Sie auch, dass ich% 2 als Schlüssel in der Rewrite-Map verwenden muss, da% 1 entweder "location" oder "place" enthält. Wenn Sie Klammern zum Gruppieren von Mustern verwenden, werden diese auch erfasst, unabhängig davon, ob Sie das Ergebnis der Aufnahme verwenden möchten oder nicht ...


15
2018-04-06 11:57



Der letzte Satz ist nicht ganz richtig. Das mod_rewrite Regexp-Engine unterstützt nicht erfassende Gruppen wie (?:location|place) und dies wird nur eine Aufnahme in dem Beispiel haben. - TerryE


Was sind die häufigsten?   Fehler / Fallstricke beim Umschreiben   Regeln?

Eine wirklich einfache Falle ist, wenn Sie URLs umschreiben, die den scheinbaren Pfad ändern, z. von /base/1234/index.html zu /base/script.php?id=1234. Bilder oder CSS mit relativen Pfaden zum Speicherort des Skripts werden vom Client nicht gefunden. Eine Reihe von Optionen, um dies zu beheben, finden Sie unter diese Frage.


12
2018-01-01 04:02



Danke für den Link. Besonders wenn ich mit anderen Teammitgliedern arbeite, die mit dem Umschreiben nicht vertraut sind, finde ich das Hinzufügen eines <base> Tag, um am einfachsten zu folgen und dennoch relative Pfade zu aktivieren. - kontur