Nginx verifica vários diretórios, se existir um arquivo redirecionado para esse diretório

1

Use algo como try_files como posso verificar vários diretórios para ver se existe um arquivo? Se o arquivo existir, redirecione para esse local, se não exibir 404.

pasta antiga ^/wp-content/uploads(/.*)?$

várias pastas para verificar

/sites/default/files$1;
/sites/default/files/testA$1;
/sites/default/files/testB$1;
/sites/default/files/testC$1;
/sites/default/files/testD$1;

ex: se o arquivo estiver presente em /sites/default/files/testB$1; , em seguida, reescreva ^/wp-content/uploads(/.*)?$ para esse local

    
por acctman 27.08.2016 / 05:02

1 resposta

2

Isso provavelmente é mais fácil de ser feito com vários blocos if , mas leia este primeiro , porque você deve usar apenas instruções como rewrite ... last ou return dentro de um bloco if .

Algo assim pode funcionar para você:

location ~ ^/wp-content/uploads(?<name>/.*)?$ {
    if (-f $document_root/sites/default/files$name) {
        return 301 /sites/default/files$name;
    }
    if (...) { ... }
    if (...) { ... }
    if (...) { ... }
    if (...) { ... }
    return 404;
}

Você precisa posicionar o bloco location acima de outras expressões regulares location blocks, que podem entrar em conflito com ele. Consulte este documento para obter detalhes.

EDIT: Talvez pareça melhor como parâmetros para uma diretiva try_files . Não sei se existe um limite superior no tamanho de uma declaração try_files :

location ~ ^/wp-content/uploads(?<name>/.*)?$ {
    try_files
        /sites/default/files$name
        /sites/default/author_images$name
        /sites/default/blog_images$name
        ...
        =404;
}

Pode ser necessário experimentar o ? final na expressão regular. Você quer que o URI /wp-content/uploads corresponda ao local?

    
por 27.08.2016 / 11:50

Tags