2 Stimmen

Apache RewriteRule mit RewriteMap

Ich habe eine RewriteMap das so aussieht:

Guide           1
Mini-Guide      2
White Paper     3

und ich füge es ein in Apache über

RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt

Ich möchte eine RewriteRule die nur Werte von der linken Seite der besagten RewriteMap in dieser Position zu sein;

RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2

Ich weiß, ich kann die ${legacy} auf der rechten Seite, aber kann ich sie auch auf der linken Seite verwenden, und wenn ja, wie?

7voto

matpie Punkte 16396

In Ihrer Map-Datei ist die linke Seite der Schlüssel und die rechte Seite der Wert. Wenn Sie eine Regel für den Abgleich mit einer Map erstellen, geben Sie den Schlüssel ein und der Wert wird ausgegeben.

Ändern Sie Ihre RewriteRule wie folgt:

# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
            /blah.php?subsection=${legacy:$1}&title=$2

Die erste Gruppierung erfasst die Zeichenfolge in der eingehenden URL. Das $1 in der Ersetzung wendet sie auf die benannte Karte an. Um einen Standardwert zu erstellen, ändern Sie ${legacy:$1} a ${legacy:$1|Unknown} .

Wenn Sie schließlich möchten, dass die Regel nur auf Werte in der Map-Datei angewendet wird, fügen Sie eine RewriteCond :

RewriteCond ${legacy:$1|Unknown} !Unknown
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
            /blah.php?subsection=${legacy:$1}&title=$2

Die Bedingung besagt, dass, wenn die Karte nicht den Standardwert zurückgibt ( Unknown ), dann führen Sie die nächste Regel aus. Andernfalls überspringen Sie die Regel und fahren Sie fort.

Apache RewriteMap

2voto

hqx5 Punkte 131

Eine andere Variante:

# %1 will be the subpattern number1 afterwards
RewriteCond %{REQUEST_URI} ^/section/downloads/(.*)
# check if there is no mapping for %1
RewriteCond ${legacy:%1} !^$
# if there is rewrite it
RewriteRule ^/(.*) /blah.php?subsection=${legacy:%1}&title=$2 [R]

1voto

Cheeso Punkte 184210

Sie sagten, Sie wollen nur Werte zulassen, die in der Karte gefunden wurden. Das ist nicht möglich, es sei denn, Sie geben eine zusätzliche Einschränkung in der Regex für die Erfassungsgruppe an. Es gibt keine Möglichkeit, dies mit der Map selbst zu tun. Soweit ich weiß, gibt es keine "map.keys"-Syntax, die Sie auf der linken Seite, dem Muster, anwenden können.

ABER,
Sie können einen Standardwert angeben, wenn der erfasste Wert nicht gefunden wird. Auf diese Weise:

## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
        /blah.php?subsection=${legacy:$1|defaultValue}&title=$2

Ersetzen Sie "defaultValue" durch einen Wert Ihrer Wahl. Zum Beispiel 0 (Null) oder "notfound", wenn das angegebene Argument nicht in der Karte gefunden wird.

Sie können dann entweder das Ergebnis mit einer anderen Regel umschreiben oder es einfach durchlaufen lassen und eine "404"-Meldung an der URL mit dem Standardwert bereitstellen.

Wenn Sie sich für eine andere Regel entscheiden, würde sie wie folgt aussehen:

## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
        /blah.php?subsection=${legacy:$1|notFoundMarker}&title=$2

## This rule fires if the lookupKey was not found in the map in the prior rule.
RewriteRule ^/blah.php?subsection=notFoundMarker  /404.php   [L]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X