Posso usar diretivas If aninhadas em .htaccess no Apache 2.4

1

Estou tentando simular a estrutura de permalink de uma versão anterior do meu site usando as regras Redirect e RedirectMatch no meu arquivo .htaccess.

Eu tenho regras diferentes que gostaria de aplicar a diferentes caminhos do meu site antigo. Alguns diretórios não têm análogo e eu quero que eles redirecionem para um único local. Alguns diretórios contêm muitos itens (milhares) em locais diferentes e eu quero que eles redirecionem de maneira inteligente para os novos locais corretos no novo site.

Parece que eu poderia proteger e agrupar itens relacionados com um teste básico de regex em < Se > para impedir que todos os redirecionamentos agrupados contidos sejam testados se nunca correspondam. Nesse método, a configuração resultante parece lógica e coerente e pode ser gerada automaticamente:

<If "%{REQUEST_URI} =~ m#^/categories/software/.*#">
    # These rules aren't considered if the request wasn't for a subpath of categories/software.

    <If "%{REQUEST_URI} =~ m#^/categories/software/store/.*#">
        # All old store pages now invalid, go to main store.    
        RedirectMatch 301 .* /software-store/
    </If>

    # Regexes for each category of software to group them logically.
    # And so that 1,000s of redirects don't get considered on each page load.
    <If "%{REQUEST_URI} =~ m#^/categories/software/item/.*#">
        # Loads and loads of redirect lines for pages with arbitrary rules to product pages.
        Redirect 301 "/categories/software/item/foo" /software-store/games/foo
        Redirect 301 "/categories/software/item/bar" /software-store/productivity/bar
        Redirect 301 "/categories/software/item/baz" /software-store/misc/baz
        # ...
    </If>
    <If "%{REQUEST_URI} =~ m#^/categories/software/dlc/.*#">
        # Loads and loads of redirect lines. It could also be grouped into subdirectories of dlc/ and so on.
        # ...
    </If>
</If>
# ...

Para um catálogo enorme, alguns regexes de proteção podem impedir milhares de testes inúteis.

Estou usando o Apache 2.4, em que o < If > diretiva está disponível, mas as diretivas acima não estão tendo o efeito esperado. O interior < s > s está sendo ignorado completamente.

Se eu remover a tag < If > e só tem o mais íntimo < se > s presente as regras funcionam, então eu não acredito que minha sintaxe ou minhas regras de redirecionamento estão em falta.

Suspeito que o problema é que não posso aninhar < Se > s, embora isso pareça ser uma coisa muito comum que você queira fazer. Não consigo ver qualquer referência ao aninhamento, permitido ou não, na documentação. link

Posso aninhar < se > diretivas? E se sim / se não for assim, você pode me apontar para a seção da documentação que diz o porquê.

    
por user317690 20.10.2015 / 16:07

2 respostas

2

Uma diretiva <If> não pode ser aninhada dentro de outra diretiva <If> , mas pode ser aninhada em outras seções como <Directory> , <Location> , <Files> e <IfModule> .

A Documentação do Apache 2.4 para a Diretiva If tem o seguinte aviso:

Not a scripting language

The name of this directive is very familiar to programmers and admins but it should not be confused with its counterpart in scripting languages. For example, the current implementation does not contemplate the possibility of having a <If> section inside another one (the inner <If> will be ignored).

Nenhuma razão é dada por que eles optaram por não permitir diretivas <If> aninhadas.

As únicas outras informações sobre aninhamento fornecidas na documentação indicam que cada tipo de seção é diferente de ser ou não pode ser aninhado:

Nesting of sections

Some section types can be nested inside other section types. On the one hand, <Files> can be used inside <Directory>. On the other hand, <If> can be used inside <Directory>, <Location>, and <Files> sections (but not inside another <If>). The regex counterparts of the named section behave identically.

    
por 20.04.2017 / 11:16
0

O Apache não necessariamente "lê" as configurações "em ordem", mas passa por um processo de fusão bastante complexo. Por causa disso, a melhor "correspondência" às vezes é difícil de prever e quase sempre requer a consideração de diretivas que aparecem em todas as várias seções de configuração.

Você pode revisar a documentação das seções de configuração , com atenção especial a como as seções são mescladas para entender melhor isso.

Observe também que você pode obter melhores resultados ao adicionar diretivas como < Else > e < ElseIf > .

    
por 18.04.2016 / 13:49