Question

J'ai un RewriteMap qui ressemble à ceci:

Guide           1
Mini-Guide      2
White Paper     3

et je suis compris dans Apache via

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

Je veux créer une RewriteRule qui permettra uniquement les valeurs du côté gauche dudit RewriteMap pour être dans cette position;

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

Je sais que je peux utiliser ${legacy} sur le côté droit, mais je peux l'utiliser à gauche, et si oui, comment?

Était-ce utile?

La solution

Dans le fichier de la carte, le côté gauche est la clé et le côté droit est la valeur. Lorsque vous créez une règle pour faire correspondre contre une carte, vous entrez la clé et délivre la valeur.

Changer votre RewriteRule à ceci:

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

Le premier groupe capture la chaîne dans l'URL entrant. Le 1 $ dans le remplacement applique à la carte donnée. Pour une valeur par défaut, changer ${legacy:$1} à ${legacy:$1|Unknown}.

Enfin, si vous ne souhaitez que la règle de travailler sur des valeurs qui sont dans le fichier de la carte, ajouter un RewriteCond:

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

La condition dit que si la carte ne retourne pas la valeur par défaut (Unknown), puis exécutez la règle suivante. Sinon, passez la règle et passer à autre chose.

Apache RewriteMap

Autres conseils

une autre 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]

Vous avez dit, vous voulez autoriser uniquement les valeurs trouvées dans la carte. Ceci est impossible sauf si vous spécifiez une restriction supplémentaire regex pour le groupe de capture. Il n'y a aucun moyen de le faire avec la carte elle-même. Il n'y a pas de syntaxe « de map.keys », pour autant que je sache, que vous pouvez appliquer sur le côté gauche, le motif.

,
Vous pouvez spécifier une valeur par défaut si la valeur capturée est introuvable. De cette façon:

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

Remplacer « defaultValue » avec tout ce que vous aimez. Par exemple 0 (zéro), ou « notfound », si le arg donné ne se trouve pas sur la carte.

Vous pouvez alors réécrire le résultat de cela, avec une autre règle, ou tout simplement lui permettre de circuler à travers et de fournir un message « 404 » à l'URL avec la valeur par défaut.

Si vous choisissez d'utiliser une autre règle, il ressemblerait à ceci:

## 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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top