Reescriterule Apache com rewritemap
-
19-09-2019 - |
Pergunta
tenho uma RewriteMap
isso se parece com o seguinte:
Guide 1
Mini-Guide 2
White Paper 3
E estou incluindo isso em Apache
através da
RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt
Eu quero criar um RewriteRule
isso permitirá apenas valores do lado esquerdo do referido RewriteMap
estar nesta posição;
RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2
Eu sei que posso usar ${legacy}
No lado direito, mas posso usá -lo à esquerda e, em caso afirmativo, como?
Solução
No seu arquivo de mapa, o lado esquerdo é a chave e o lado direito é o valor. Quando você cria uma regra para corresponder a um mapa, você insere a chave e ela gera o valor.
Altere sua reescrita para isso:
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1}&title=$2
O primeiro agrupamento captura a corda no URL de entrada. Os US $ 1 na substituição o aplicam ao mapa nomeado. Para fazer um valor padrão, mude ${legacy:$1}
para ${legacy:$1|Unknown}
.
Por fim, se você deseja que apenas a regra funcione sobre valores que estão no arquivo de mapa, adicione um RewriteCond
:
RewriteCond ${legacy:$1|Unknown} !Unknown
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1}&title=$2
A condição diz que se o mapa não retornar o valor padrão (Unknown
), em seguida, execute a próxima regra. Caso contrário, pule a regra e siga em frente.
Outras dicas
Outra 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]
Você disse, deseja permitir apenas valores encontrados no mapa. Isso não é possível, a menos que você especifique uma restrição adicional no Regex para o grupo de captura. Não há como fazer isso com o próprio mapa. Não há sintaxe "map.keys", até onde eu sei, que você pode aplicar no lado esquerdo, o padrão.
MAS,
Você pode especificar um valor padrão se o valor capturado não for encontrado. Deste jeito:
## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1|defaultValue}&title=$2
Substitua "DefaultValue" pelo que você quiser. Por exemplo, 0 (zero), ou "notfound", se o arg fornecido não for encontrado no mapa.
Você pode reescrever o resultado disso, com outra regra ou apenas permitir que ela flua e forneça uma mensagem "404" na URL com o valor padrão.
Se você optar por usar outra regra, ficaria assim:
## 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]