Spezialthema

This page has been robot translated, sorry for typos if any. Original content here.

Wie man tatsächlich mod_rewrite arbeiten. Allowance für die Weiterbildung

Как на самом деле работает mod_rewrite. Пособие для продолжающих

Dieser Artikel entstand aus den Ideen Weiterbildung unserer Mitarbeiter, die Arbeit mit mod_rewrite unterstützen. Die Praxis hat gezeigt, dass nach in einer großen Anzahl von Lehrbücher in russischer Sprache technischen Support gute Entscheidung gegeben Routineaufgaben, sondern eine unabhängige Erstellung der Regeln kommt durch Versuch und viele Fehler vorhanden studieren. Das Problem ist, dass für ein gutes Verständnis für die Notwendigkeit, die mod_rewrite englischen Original-Dokumente zu studieren, dann - entweder eine weitere Klärung oder Stunden Experimente RewriteLog.

Der Artikel beschreibt den Mechanismus mod_rewrite funktioniert. Zu verstehen, wie es funktioniert, können Sie den Effekt der jeweiligen Richtlinie, und eine klare Vorstellung von klar zu erkennen, was in einem bestimmten Zeitpunkt innerhalb eines mod_rewrite in Verarbeitungsrichtlinien geschieht.

Ich gehe davon aus, dass der Leser bereits vertraut mit dem, was der mod_rewrite, und ich werde seine Fundamente nicht beschreiben, die im Internet leicht zu finden sind. Es sollte auch darauf hingewiesen werden, dass der Artikel unterstreicht die mod_rewrite Arbeit seine Richtlinien in der .htaccess-Datei. Die Unterschiede bei der Arbeit im Zusammenhang mit der eingestellt am Ende heraus.

So haben Sie die mod_rewrite gelernt, belief sich auf mehrere RewriteRule und hatte die unendliche Umleitung mit dem Fall, in dem eine Regel aus irgendeinem Grund zu stellen hat Ihre Anfrage nicht fangen, sowie unvorhersehbare Arbeitsregelgruppe, wenn eine Regel plötzlich nachfolgende Änderungsanforderung, die sorgfältig von den bisherigen Regeln vorbereitet.

Was funktioniert RewriteRule

Der erste RewriteRule ist die Art und Weise von dem Ort, wo die .htaccess bestanden, auf die gewünschte Datei. Diese Zeile wird nicht mit "/" beginnen. Im Anschluss RewriteRule Ergebnis der vorherigen Transformation übertragen.

Um genau zu verstehen , wie die RewriteRule, müssen Sie zuerst bestimmen , was es funktioniert. Betrachten wir als ein Apache die Zeichenfolge wird, die ursprünglich für die Verarbeitung RewriteRule in .htaccess übertragen wurde.

Sobald Sie mit dem mod_rewrite anfangen zu arbeiten, ist es logisch anzunehmen, dass es mit Links funktioniert. Jedoch im Fall von mod_rewrite in .htaccess Verwendung ist es nicht. In der Tat RewriteRule ist keine Verbindung bestanden, und der Pfad zur angeforderten Datei.

Aufgrund der internen Architektur von Apache in der Zeit, wenn der Betrieb .htaccess eintritt, kann mod_rewrite behandeln nur nach oben durch die Datei verarbeitet werden. Dies ist aufgrund der Tatsache, dass vor dem Übertragungsanforderung bereits in mod_rewrite anderen Modulen ändern könnte (zB mod_alias) und die endgültige Pfad zu der Datei auf der Website können die ursprünglichen Referenz nicht überein. Wenn mod_rewrite mit der ursprünglichen Verbindung gearbeitet, würde es die Funktion der Module stören, der die Anfrage an ihn verändert haben.

Daher mod_rewrite auf den absoluten Pfad der Datei verarbeitet werden, übertragen wird. mod_rewrite kennt auch den Weg in .htaccess, die die RewriteRule Regel beherbergt. Um den Pfad zu der Datei ist so etwas wie ein Link zu machen, die eine Website-Entwickler zu betreiben plant, schneidet der mod_rewrite Teil des absoluten Pfad zur Datei .htaccess ab.

Also, das ist der Weg, der den Weg zum .htaccess abgeschnitten, bestand die erste RewriteRule. Zum Beispiel:

  • Abfrage: http://example.com/templates/silver/images/logo.gif
  • DocumentRoot: /var/www/example.com
  • Der Pfad zur Datei: /var/www/example.com/templates/silver/images/logo.gif
  • .htaccess ist in: /var/www/example.com/templates/.htaccess
  • Auf der ersten RewriteRule werden übertragen: silber / images / logo.gif
  • Hinweis: «templates /» auch abgeschnitten.

Как на самом деле работает mod_rewrite. Пособие для продолжающих

Der Weg zum .htaccess wird mit einem Schrägstrich schneiden. Dies ist eine Folge aus: einer Zeichenfolge, die ursprünglich für die Verarbeitung RewriteRule nie mit einem "/" beginnt, übertragen wurde.

Es ist wichtig , das tut RewriteRule zu erinnern. Dabei spielt es keine Namen der Website behandeln, die Argumente, die an das Skript übergeben werden, und die Verbindung all das nicht verarbeiten, wenn die .htaccess nicht in der Site-Stamm gehostet wird. Alle diese Angebote RewriteCond, die kurz später berühren auf. Also:

# работать не будет - правило начинается со /
RewriteRule ^/index.php$ /my-index.php

# работать не будет - название сайта не анализируется RewriteRule
RewriteRule ^example.com/.* http://www.example.com

# работать не будет - аргументы ссылки не попадают в RewriteRule
RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1
# работать не будет - правило начинается со /
RewriteRule ^/index.php$ /my-index.php

# работать не будет - название сайта не анализируется RewriteRule
RewriteRule ^example.com/.* http://www.example.com

# работать не будет - аргументы ссылки не попадают в RewriteRule
RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1
0-9] +) news.php? Page = $ # работать не будет - правило начинается со /
RewriteRule ^/index.php$ /my-index.php

# работать не будет - название сайта не анализируется RewriteRule
RewriteRule ^example.com/.* http://www.example.com

# работать не будет - аргументы ссылки не попадают в RewriteRule
RewriteRule index.php\?newspage=([0-9]+) news.php?page=$1
# Будет работать только если .htaccess находится там же, где находится папка templates,
# например, в корне сайта. То есть, если .htaccess находится в templates/.htaccess , правило
# работать НЕ БУДЕТ, потому что mod_rewrite отрежет путь до .htaccess и на вход RewriteRule
# строка попадет уже без "templates/"
RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif
, # Будет работать только если .htaccess находится там же, где находится папка templates,
# например, в корне сайта. То есть, если .htaccess находится в templates/.htaccess , правило
# работать НЕ БУДЕТ, потому что mod_rewrite отрежет путь до .htaccess и на вход RewriteRule
# строка попадет уже без "templates/"
RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif
, # Будет работать только если .htaccess находится там же, где находится папка templates,
# например, в корне сайта. То есть, если .htaccess находится в templates/.htaccess , правило
# работать НЕ БУДЕТ, потому что mod_rewrite отрежет путь до .htaccess и на вход RewriteRule
# строка попадет уже без "templates/"
RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif
- # Будет работать только если .htaccess находится там же, где находится папка templates,
# например, в корне сайта. То есть, если .htaccess находится в templates/.htaccess , правило
# работать НЕ БУДЕТ, потому что mod_rewrite отрежет путь до .htaccess и на вход RewriteRule
# строка попадет уже без "templates/"
RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif
# Будет работать только если .htaccess находится там же, где находится папка templates,
# например, в корне сайта. То есть, если .htaccess находится в templates/.htaccess , правило
# работать НЕ БУДЕТ, потому что mod_rewrite отрежет путь до .htaccess и на вход RewriteRule
# строка попадет уже без "templates/"
RewriteRule ^templates/common/yandex-money.gif$ templates/shared/yad.gif

Zu Beginn der Verwendung von mod_rewrite, ich arbeite sehr gerne mit ihm nur in der .htaccess im Stammordner. Dies wird mehr Kontrolle über seine Arbeit zu erleichtern.

Was funktioniert RewriteRule, verstehen wir. Nun wollen wir sehen , wie es funktioniert.

Wie funktioniert RewriteRule

RewriteRule wandelt einfach die Zeichenfolge in Übereinstimmung mit den regulären Ausdrücken und alle. RewriteRule arbeitet mit einer Schnur, und nicht mit Verweis auf die Datei oder durch.

Wie wir oben erläutert, wird der Eingang auf RewriteRule den Weg von der .htaccess-Datei zu suchen. Der bequemste Weg ist, ignorieren jetzt die Pfade und Links und betrachten etwas, mit dem die RewriteRule arbeitet, als einfache Zeichenfolge. Diese Linie wird von der RewriteRule zu RewriteRule übertragen, mutieren, wenn ein Teil der RewriteRule Arbeit.

Im Allgemeinen, wenn wir die Schwierigkeiten bei der Verwendung von Fahnen (von denen einige im Folgenden erörtert wird) auszuschließen und die Schwierigkeiten bei der regulären Ausdrücken Kompilieren (die wir fast nicht in diesem Artikel berührt), arbeitet die RewriteRule sehr einfach.

  1. Wir nahmen Linie.
  2. Vergleichen Sie dies mit einem regulären Ausdruck im ersten Argument.
  3. Wenn es ein Zufall ist - die gesamte Zeichenfolge in das zweite Argument ersetzt.
  4. Übergeben Sie die Zeichenfolge an den folgenden RewriteRule.

Hier im allgemeinen und alle. Zur Verdeutlichung, dass die RewriteRule genau die Zeichenfolge funktioniert, sollten Sie die folgenden fantastisches Beispiel:

# Запрос: http://mysite.com/info.html
# В первый RewriteRule попадет "info.html"

# Преобразовываем запрос в произвольную строку.
RewriteRule ^info.html$ "I saw a turtle in the hole. And it was dancing rock-n-roll. And it was smiling. All in all, it was a very funny doll."

# "info.html" -> "I saw a turtle..."

# Заменяем эту строку на внешнюю ссылку.
RewriteRule turtle https://example.com/information/index.html

# "I saw a turtle..." -> "https://example.com/information/index.html"

# Заменяем имя сайта!
RewriteRule ^(.*)example.com(.*)$ $1example.org$2

# "https://example.com/information/index.html" -> "https://example.org/information/index.html"

# Заменяем протокол!
RewriteRule ^https :( .*)$ ftp:$1

# "https://example.org/information/index.html" -> "ftp://example.org/information/index.html"

# Заменяем конечную ссылку.
RewriteRule ^(.*)/index.html$ $1/main.php

# "ftp://example.org/information/index.html" -> "ftp://example.org/information/main.php"

Wie Sie sehen können, ist die RewriteRule wie eine Menge Arbeit - es ist einfach eine Zeichenkette verwandelt nach ihren Argumenten zu fragen. Wenn Sie möchten, können Sie eine beliebige Zeichenfolge in den Datensätzen speichern können sogar Nullen und Kreuze auf RewriteRule schreiben, wenn Sie es wünschen, Ausdauer und eine gute Kenntnis von regulären Ausdrücken.

Hier müssen Sie einen Punkt zu machen: auch RewriteRule und arbeitet mit einer klaren Linie, es immer noch auf der Arbeit mit Referenzen konzentriert. Daher wird es in besonderer Weise zu den Leitungen zu reagieren, beginnend mit «https: //» "?" Oder Analoga (denken Sie daran, dass wir eine externe Umleitung tun wollte) und das Symbol (Vertritt die Ansicht, die folgenden Zeichen Argumente sind, die auf die Anfrage zu sein Ersatz benötigen). Nun aber ist uns egal - es ist wichtig zu verstehen, dass die RewriteRule keine Magie ist - es dauert nur einen String und ändern Sie es so, wie Sie es gesagt. Externe Umleitungen und Argumente werden später in diesem Artikel in Betracht gezogen werden, gibt es auch eine Menge zu erzählen.

Schließlich werden die Änderungen vorgenommen und ausgeführt, um die letzte RewriteRule, tritt RewriteBase ein.

Was ist der RewriteBase

Wenn Sie feststellen, dass nach der Transformation Anfrage ist relativ und unterscheidet sich von der ursprünglichen, RewriteBase sich auf der linken Seite, um ihn hinzuzufügen. Es ist notwendig, in der .htaccess RewriteBase angeben. Sein Wert - der Weg von der Site-Stamm in .htaccess. RewriteBase nur durchgeführt, nachdem alle der RewriteRule, aber nicht zwischen ihnen.

Wir haben bereits erwähnt, dass in der mod_rewrite, .htaccess in arbeitet, bekommt den absoluten Pfad zu der gewünschten Datei. Um es auf den RewriteRule übertragen, schneidet mod_rewrite den Pfad zum .htaccess ab. Dann herrscht RewriteRule eins nach dem anderen in Folge Änderungsanforderung. Und nachdem die Anforderung geändert wird, Apache müssen den absoluten Pfad der Datei wiederherstellen, die es schließlich verarbeitet werden sollen. RewriteBase tatsächlich ein Hack, der den ursprünglichen Pfad zur Datei wiederherstellen hilft.

RewriteBase durchgeführt, nachdem alle Transformationen. Das bedeutet, dass sie nicht zwischen der Abfrage RewriteRule ändern wird, und in Kraft treten wird nur, wenn alle RewriteRule funktioniert.

Nachdem alle Änderungen sieht RewriteBase relativ am Ende oder einen absoluten Pfad stellte sich heraus. In Apache Zusammenhang verweist sie auf einen relativen oder absoluten Pfad von der Wurzel der Site zu zählen:

  • images / logo.gif - relativ.
  • /images/logo.gif - absolut (beginnend Schrägstrich).
  • http://example.com/images/logo.gif - die absolute aller.

Wenn der Pfad absolut ist, tut RewriteBase nichts. Und wenn ein relativer - RewriteBase anhängt sich nach links. Dies funktioniert sowohl für interne und externe Umleitungen:

# .htaccess находится в /images/
# RewriteBase указан /images/
RewriteBase /images/

# Запрос http://example.com/images/logo.gif
# На вход RewriteRule попадает "logo.gif"
RewriteRule ^logo.gif$ logo-orange.gif
# После RewriteRule: "logo.gif" -> "logo-orange.gif"
# После RewriteBase: "logo-orange.gif" -> "/images/logo-orange.gif"

# Запрос http://example.com/images/header.png
# На вход RewriteRule попадает "header.png"
RewriteRule ^header.png$ /templates/rebranding/header.png
# После RewriteRule: "header.png" -> "/templates/rebranding/header.png"
# После RewriteBase: ничего не меняется, так итоговый результат преобразований начинается со "/'.

# Запрос http://example.com/images/director.tiff
# На вход RewriteRule попадает "director.tiff"
# Используем внешний относительный редирект
RewriteRule ^director.tiff$ staff/manager/director.tiff [R=301]
# После RewriteRule: "director.tiff" -> "staff/manager/director.tiff"
# + mod_rewrite запомнил, что будет внешний редирект
# После RewriteBase: "staff/manager/director.tiff" -> "/images/staff/manager/director.tiff"
# mod_rewrite вспомнил про внешний редирект:
# "/images/staff/manager/director.tiff" -> http://example.com/images/staff/manager/director.tiff

Normalerweise nach einiger Vertrautheit mit mod_rewrite nächsten Gewohnheit entwickelt: 1) in jeder .htaccess «RewriteBase /» hinzufügen, 2) alle beginnen mit einem Schrägstrich-Umleitung: «RewriteRule news.php /index.php?act=news». Dies hilft loszuwerden Artefakte funktionieren RewriteBase, aber nicht so falsch. Nun , da wir wissen , was die RewriteBase macht, kann nach den richtigen Regeln formuliert werden:

  1. RewriteBase müssen den Pfad von der Site-Stamm entsprechen in .htaccess.
  2. Root-Umleitung "/" Sie brauchen nur, wenn Sie einen absoluten Pfad von der Site-Stamm in die Datei angeben.

Как на самом деле работает mod_rewrite. Пособие для продолжающих

Was passiert, wenn Sie nicht RewriteBase angeben? Standardmäßig wird das Apache es gleich dem absoluten Pfad zu dem Dateisystem in .htaccess (zB /var/www/example.com/templates/). Die Unrichtigkeit dieser Annahme Apache auf den relativen externen Umleitungen gezeigt:

# Запрос http://example.com/index.php
# DocumentRoot: /var/www/example.com/
# .htaccess находится в корне сайта, и в нем НЕ УКАЗАН RewriteBase.
# Поэтому по умолчанию RewriteBase равен абсолютному пути до .htaccess: /var/www/example.com/

# На входе RewriteRule - "index.php"
RewriteRule ^index.php main.php [R]
# На выходе: "index.php" -> "main.php"
# mod_rewrite запомнил, что нужен внешний редирект

# Закончились RewriteRule
# mod_rewrite все равно выполняет RewriteBase, так как у него есть значение по умолчанию.
# Получается: "main.php" -> "/var/www/example.com/main.php"

# Здесь mod_rewrite вспоминает, что был внешний редирект:
# "/var/www/example.com/main.php" -> http://example.com/var/www/example.com/main.php

# Получилось совсем не то, что имели в виду.

So ging eine Anfrage durch alle RewriteRule, und ihm dann, falls notwendig, hinzugefügt RewriteBase. Sollte nun Apache um die Datei zu geben, die das resultierende Weg zeigt? Nein. Nun wird die resultierende Anforderung erneut verarbeitet werden.

Wie funktioniert mod_rewrite. Die Flagge [L]

mod_rewrite beginnt mit der Verarbeitung der Anforderung immer wieder, solange er sich nicht ändern, selbst wenn aufhören. Und das Flag [L] kann es nicht stoppen.

Bei der Erstellung eines mehr oder weniger komplexe Konfigurationen mod_rewrite up ist wichtig , dass die Änderungsanforderung am letzten RewriteRule endet nicht zu verstehen. Nachdem letzte Regel RewriteRule gearbeitet und wurde RewriteBase, mod_rewrite Aussehen, Änderungsanforderung oder nicht hinzugefügt. Wenn die Anforderung geändert wird, beginnt seine Verarbeitung wieder von Anfang an von .htaccess.

Apache tut so, weil es in ein anderes Verzeichnis in der Änderungsanforderung weitergeleitet werden könnten. Es kann seine eigene .htaccess haben, die nicht in der vorherigen Abfrageverarbeitung beteiligt war. Das gleiche kann .htaccess neue Regeln, die die Abfrageverarbeitung beeinflussen - wie mod_rewrite Regeln und Vorschriften der anderen Module. Um richtig mit dieser Situation umgehen, Apache sollte den gesamten Behandlungszyklus erneut aus.

Warten Sie eine Minute, aber es ist ein Flag [L], der die Anforderung mod_rewrite'om beendet die Verarbeitung -

Nicht ganz. Das Flag [L] stoppt die aktuelle Iteration der Abfrage. Wenn jedoch die Anfrage von RewriteRule modifiziert wurde, die noch arbeiten musste, wird Apache Anfrage Verarbeitungszyklus beginnen wieder mit dem ersten RewriteRule.

# Запрос: http://example.com/a.html

RewriteBase /

RewriteRule ^a.html$ b.html [L]
RewriteRule ^b.html$ a.html [L]

Das obige Beispiel wird in einer Endlosschleife von Umleitungen führen und «Internal Server Error» am Ende. In diesem Beispiel ist eine Endlosschleife offensichtlich, aber in komplexeren Konfigurationen erfordern können in den Regeln Graben zu bestimmen, welche zusammen geschleift Abfragen.

Um solche Situationen zu vermeiden, wird empfohlen, um das Flag zu verwenden [L] nur bei Bedarf. Der Bedarf kann von zwei Arten sein:

  1. Bei Verwendung eines externen Redirect - [L, R = 301] oder [L, R = 302]. Im Falle einer externen Umleitungsanforderung Weiterverarbeitung ist unerwünscht (siehe. Im Folgenden über die Flagge [R]), und es ist besser, zu stoppen
  2. Wenn es .htaccess Schleife, aus dem kein Entrinnen, und mod_rewrite'om Abfrageverarbeitung zu stoppen gezwungen werden sollte. In diesem Fall wird das spezielle Design - siehe weiter unten im Artikel Tipps zum Thema ..

Aber das folgende Beispiel nicht stecken. Versuchen Sie herauszufinden, warum, und was die Ergebnisdatei Apache'm gegeben werden.

# Запрос: http://example.com/a.html
# Начало .htaccess

RewriteBase /
RewriteRule ^a.html$ b.html
RewriteRule ^b.html$ a.html

# Конец .htaccess

Wie funktioniert mod_rewrite. Flag [R]

Flag [R] hört nicht auf die Anfrage ist, sofort externe Umleitung zurück. Stattdessen erinnert er sich die Notwendigkeit für eine externe Weiterleitung und Verarbeitung von Abfragen weiter folgende RewriteRule. Es wird empfohlen, immer die Fahne verwenden [L].

Flag [R] sagt Apache, müssen Sie sich keine interne und externe Umleitung durchzuführen. Was unterscheidet sich von der externen Umleitungs internen? Interne Weiterleitung einfach verändert den Pfad zu der Datei, die dem Benutzer gegeben werden, und der Benutzer feststellt, dass die Datei empfängt, die er ursprünglich angefordert. Bei der gleichen externen Apache Umleitung der Benutzer den Status der Antwort zurückgibt, anstatt des Dateiinhalts 301 oder 302 und berichtet einen Link für den Browser eine Datei abgerufen werden soll in Verbindung.

Es scheint, dass, wenn das Flag Verarbeitung [R] Apache sollte sofort RewriteRule Verarbeitung und Rück den Benutzer auf externe Umleitung zu stoppen. Aber lassen Sie uns ein fantastisches Beispiel für den Abschnitt erinnern "Wie funktioniert RewriteRule». Darin identifiziert wir zuerst die Fahne [R], wodurch die Notwendigkeit für eine externe Umleitung bezeichnet, und ging dann auf den Link folgenden RewriteRule zu ändern.

Das ist, wie Apache funktioniert durch eine externe Umleitung angeben. Er hat einfach "Marken" zu mir selbst, dass nach allen Regeln müssen Sie den Status 302 (Standardeinstellung) zurück, aber es setzt die RewriteRule alle weiter unten in der Liste auszuführen. Wir können weiterhin die Abfrage zu verändern, wie wir brauchen, das einzige, was nicht funktioniert - zurück im Inland eine Umleitung zu machen.

Allerdings ist es unwahrscheinlich, dass Sie nach der externen Umleitung irgendeiner Weise zurückkehren wollen, es zu ändern. Daher ist es bei der Verwendung des Merkers [R] empfohlen , sie in Verbindung mit der [L] , um anzugeben:

# BlackJack переехал на красивое имя
RewriteRule ^bj/(.*) blackjack/$1 [R=301,L]

# Можно использовать просто внешнюю ссылку
RewriteRule ^bj/(.*) http://blackjack.example.com/$1 [L]

Anstatt eine Flagge [R] verwenden, können Sie nur einen externen Link angeben. In diesem Fall Apache selbst erraten, dass Sie externe Umleitungen tun müssen. Hier wird wie bei dem Fall mit einem klaren Hinweis auf die Fahne [R], empfehlen wir die Verwendung eines Flags [L].

  • Wenn die externe Umleitung an den gleichen Ort führt, ist es besser, eine Flagge zu verwenden, [R], ohne eine vollständige Verbindung angibt (in anderen Worten, verwenden eine relative Umleitung extern). Dies wird der Regel unabhängig von den Namen der Website.
  • Wenn es sich um eine externe Umleitung auf eine andere Seite ist, oder als eine vollständige externer Link anzeigt, funktioniert es nicht.

Wie funktioniert mod_rewrite. Beachten Sie die Abfrageparameter und flag [QSA]

Ändern der Abfrageparameter in der RewriteRule ändert nicht die Linie, die nächste RewriteRule läuft. Wenn Sie jedoch die Parameter der Variablen ändert% {QUERY_STRING} ändern, die RewriteCond arbeiten können.

Terminologie: "Parameter" - die Parameter der Anfrage "Argumente" - die RewriteRule Argumente.

Mit RewriteRule können in die Datei verarbeitet werden, nicht nur der Pfad zu ändern, aber die GET-Request-Parameter an ihn weitergegeben werden. Es wird häufig für die Übertragung Verarbeitung im Allgemeinen CNC handler Skript verwendet, beispielsweise:

RewriteBase /

# Запрос: http://example.com/news/2010/07/12/grand-opening.html
# На входе: "news/2010/07/12/grand-opening.html"
RewriteRule ^news/(.*)$ index.php?act=news&what=$1
# После RewriteRule: "news/2010/07/12/grand-opening.html" -> "index.php"
# %{QUERY_STRING}: "" -> "act=news&what=2010/07/12/grand-opening.html"

Zu einem Zeitpunkt, wenn die Regel RewriteRule ein Fragezeichen im zweiten Argument begegnet, erkennt er, dass es eine Änderung von Parametern in der Abfrage ist. Als Ergebnis geschieht Folgendes:

  1. RewriteRule ersetzt die Zeichenfolge , mit dem sie auf dem Teil des zweiten Arguments auf das Fragezeichen funktioniert. Beachten Sie, dass die neuen Abfrageparameter fallen nicht unter die Linie, die die nächste RewriteRule Regeln ausgeführt wird.
  2. Ein Teil des zweiten Argument nach dem Fragezeichen wird auf die Variable% {QUERY_STRING}. Wenn das Flag [QSA] angegeben wurde, werden die Abfrageparameter an die Spitze% hinzugefügt {QUERY_STRING}. Wenn das Flag nicht angegeben ist,% {QUERY_STRING} vollständig die Parameter aus der Abfrage RewriteRule ersetzen.

Ein paar Beispiele:

RewriteBase /

# Запрос: http://example.com/news/2010/?page=2
# На входе RewriteRule: "news/2010/"
RewriteRule ^news/(.*)$ index.php?act=news&what=$1
# После преобразования: "news/2010/" -> "index.php"
# Значение %{QUERY_STRING}: "page=2" -> "act=news&what=2010/"

Wahrscheinlich über die Regel funktioniert nicht richtig, weil das Argument Seite verloren. Fix it:

RewriteBase /

# Запрос: http://example.com/news/2010/?page=2
# На входе RewriteRule: "news/2010/"
RewriteRule ^news/(.*)$ index.php?act=news&what=$1 [QSA]
# После преобразования: "news/2010/" -> "index.php"
# Значение %{QUERY_STRING}: "page=2" -> "act=news&what=2010/&page=2"

Wir haben nur flag [QSA] aufgenommen und begann im Allgemeinen korrekt zu arbeiten.

azhno verstehen , dass Veränderungen Abfrageparameter% ändern {QUERY_STRING}, die später in der RewriteCond verwendet werden kann. Dies sollte berücksichtigt werden, wenn die folgenden Regeln zu erstellen, die den Fall prüfen.

- Natürlich variiert es, weil eine Anfrage geht Apache'm erneut zu verarbeiten!

Nein,% {QUERY_STRING} ändert sich sofort. Der Beweis wird nicht dazu führen - über die Parameter bereits mehr geschrieben als interessant zu lesen, :)

Was können Sie tun genau die Abfrageparameter in RewriteCond zu überprüfen, ob der Benutzer übergeben hat, aber nicht RewriteRule'ami geändert? Sehen Sie sich die Tipps am Ende.

RewriteCond und Leistung

Bitte überprüfen Sie, ob die Anforderung mit RewriteRule, und dann - zusätzliche Bedingungen RewriteCond.

Ein paar Worte sollten über die Reihenfolge gesagt werden, in dem mod_rewrite führt Richtlinie. Da .htaccess RewriteCond zuerst und dann die RewriteRule, scheint es, dass mod_rewrite prüft zunächst, alle Bedingungen, und dann RewriteRule zu implementieren fortzufahren.

In der Tat ist alles, was das Gegenteil. Zunächst mod_rewrite prüft, ob der aktuelle Wert der Abfrage entspricht den regulären Ausdruck der RewriteRule, und nur dann die Bedingungen alle in der RewriteCond aufgeführten überprüfen.

Wenn Sie also eine RewriteRule regex auf zwei Seiten haben und Sie über die Leistung denken, wir die Umsetzung dieser Regel zusätzliche RewriteCond zu begrenzen entschieden, wissen Sie - es wird nicht funktionieren. In diesem Fall ist es besser , die RewriteRule Flaggen [C] oder [S] zu verwenden, komplizierter Regel zu lassen, wenn ein einfacher Test nicht funktioniert hat .

Die Variablen und Merker RewriteCond, RewriteRule andere Fahnen etc.

Lesen Sie die Dokumentation.

Wir trafen uns mit den Prinzipien der RewriteRule, RewriteBase, Flagge [L], [R] und [QSA] sowie zerlegten Abfrage-Engine innerhalb mod_rewrite. Von links unberührt: andere Flaggen RewriteRule, RewriteCond Richtlinien und RewriteMap.

Glücklicherweise sind diese Richtlinien und Flaggen nicht voll mit irgendwelchen Rätsel und funktionieren genau wie in den meisten Lehrbüchern beschrieben. Um zu verstehen, sie genug, um die offizielle Dokumentation zu überprüfen. Vor allem empfehle ich die Liste der Variablen zu untersuchen, die in der RewriteCond geprüft werden kann -% {QUERY_STING}% {THE_REQUEST}% {REMOTE_ADDR}% {HTTP_HOST}% {HTTP: header}, etc.) ..

Der Unterschied in der mod_rewrite in .htaccess Kontext und im Rahmen des Virtual

Im Rahmen der mod_rewrite funktioniert genau das Gegenteil.

Wie ich am Anfang gesagt, betrifft alle oben auf die Verwendung von mod_rewrite in .htaccess Kontext. Wenn mod_rewrite verwendet Es wird auf eine andere Art und Weise arbeiten:

  • das in RewriteRule wird es den ganzen Weg auf die Anforderung von dem ersten Schrägstrich von GET-Parameter zu starten: «http://example.com/some/news/category/post.html?comments_page=3» -> "/ news / Kategorie / Post. html ". Diese Linie beginnt immer mit /.
  • Das zweite Argument von RewriteRule ist auch notwendig, mit / zu starten, sonst wird es «Bad Request» sein.
  • RewriteBase macht keinen Sinn.
  • Recht der Passage dauert nur einmal statt. Die Flagge [L] beendet wirklich alle Regeln der Verarbeitung beschrieben in Ohne nachfolgenden Iterationen.

Tipps und Lösungen

Es enthält Spitzen, die im Verlauf des Artikels genannt werden kann, aber von dem Haupttext der Kürze wegen des Materials ausgeschlossen.

Herstellung von regulären Ausdrücken

Versuchen Sie reguläre Ausdrücke zu sein, so dass sie mehr sind eng genau diese Abfragen definiert, die Sie ändern wollen - RewriteRule Unfall zu regieren nicht für eine andere Abfrage nicht funktioniert. Zum Beispiel:

# Начинайте все регулярные выражения с "^" (признак начала строки)
# и заканчивайте "$" (признак конца строки):
RewriteRule ^news.php$ index.php
# Даже если в этом нет необходимости - для универсальности и лучшего понимания конфигурации:
RewriteRule ^news/(.*)$ index.php

# Если под маску должны попадать только цифры - укажите это явно.
# Если какие-то цифры постоянны, укажите их явно.
# Если в оставшейся части запроса не могут присутствовать слеши, ограничьте их присутствие.
# Не забывайте экранировать "." (точки).
# Следующее правило нацелено на запросы вида http://example.com/news/2009/07/28/b-effect.html
RewriteRule ^news/20[0-9]{2}/[0-9]{2}/[0-9]{2}/[^/]+\.html index.php

Allerdings, reguläre Ausdrücke, und Sie können auf unserer Website zu lesen:

Veränderungen bei den externen Umleitungen

Trotz der Tatsache, dass lässt Sie auch die mod_rewrite externe Umleitungen ändern, bis zum Protokoll, empfehle ich nicht RewriteRule mit, dies zu tun. In diesem Artikel ein Beispiel für eine Änderung der externen Umleitungen verwendet nur von Begriffen wie "Links", um loszuwerden, und "Dateien" und zeigen deutlich, dass die RewriteRule mit einem einfachen String funktioniert.

Ich glaube nicht, dass die Entwickler angenommen mod_rewrite, dass jemand das tun würde, so kann es zu allerlei Artefakte sein. Tun Sie das nicht, bitte.

Wie eine Endlosschleife zu stoppen

Manchmal Umleitung Logik auf der Website ist, dass ohne besondere Aktion mod_rewrite sieht sie als eine Endlosschleife von Umleitungen. Nehmen Sie das folgende Beispiel.

Die Seite war eine Seite /info.html. ein SEO-Spezialisten entschieden, dass die Suchmaschinen diese Seite besser Index, wenn es aufgerufen wird, und bat /information.html externe Umleitung zu Info.html auf information.html zu machen. Doch aus irgendwelchen Gründen, ihre Website-Entwickler können nicht einfach info.html in information.html umbenennen und eine Umleitung zu machen - er die Daten sicher zu sein, benötigt wurden direkt aus info.html Datei gegeben. Er schreibt die folgende Regel:

# сделать внешний редирект
RewriteRule ^info.html information.html [R,L]
# но по запросу /information.html все равно отдать info.html
RewriteRule ^information.html info.html

... Und mit einer Endlosschleife konfrontiert. Jede Anfrage /information.html erhält eine externe Umleitung zurück zu /information.html.

Die Lösung wird auf mindestens zwei Arten. Habré wurde bereits eine von ihnen beschrieben - Sie benötigen eine Umgebungsvariable zu setzen und basierend auf seinen Wert um die Umleitung zu stoppen. Der Code wird wie folgt aussehen:

RewriteCond %{ENV:REDIRECT_FINISH} !^$
RewriteRule ^ - [L]

RewriteRule ^info.html$ information.html [R,L]
RewriteRule ^information.html$ info.html [E=FINISH:1]

Bitte beachten Sie, dass der Name der Variablen mod_rewrite 'redirect_' hinzufügt.

Der zweite Weg - zu prüfen, in THE_REQUEST, dass sie vom Benutzer angefordert wurde:

# Внешний редирект происходит только если пользователь запросил info.html.
# Если же info.html - это результат внутреннего перенаправления, правило срабатывать не будет.
RewriteCond %{THE_REQUEST} "^(GET|POST|HEAD) /info.html HTTP/[0-9.]+$"
RewriteRule ^info.html$ information.html [R,L]

RewriteRule ^information.html$ info.html

Die Analyse der ursprünglichen Benutzerabfrage - der Kampf gegen die Offenlegung von Apache Verbindungen

Bei der Verarbeitung von Abfragen öffnet Apache codierte (URL-kodierte Zeichen) von der ursprünglichen Anfrage. In einigen Fällen kann dies nicht wünschenswert sein - der Entwickler will, ist zu prüfen, die ursprüngliche, unveränderte Benutzeranforderung. Sie können dies tun, indem Sie die Variable in der RewriteCond% Überprüfung {THE_REQUEST}:

RewriteCond %{THE_REQUEST} ^GET[\ ]+/tag/([^/]+)/[\ ]+HTTP.*$
RewriteRule ^(.*)$ index.php?tag=%1 [L]

Empfohlene Dokumente

Offizielle Dokumentation von Apache

Technische Details

Wie es? Abonnieren Sie RSS Nachrichten!
Sie können auch shram.kiev.ua unterstützen, klicken Sie auf:

Seien Sie nicht zu Ihren Freunden und finden Sie diese Informationen, teilen mit ihnen den Artikel nicht in Ordnung!

Expand / Collapse Box mit Kommentaren

Kommentare

im Auge kommentierte halten , dass der Inhalt und der Ton Ihrer Nachrichten , die Gefühle von echten Menschen verletzen können, Respekt und Toleranz gegenüber seinen Gesprächspartnern, auch wenn Sie Ihr Verhalten in Bezug auf die Meinungsfreiheit und die Anonymität des Internets, ändert ihre Meinung nicht teilen, nicht nur virtuell, sondern realen Welt. Alle Kommentare werden aus dem Index, Spam - Kontrolle versteckt.
Kostenlose Kreditkarte mit einem Limit von 15.000 US-Dollar.