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?

Foi útil?

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.

Apache Rewritemap

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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top