AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1082299
Accepted
Darrell Brogdon
Darrell Brogdon
Asked: 2021-11-02 08:42:24 +0800 CST2021-11-02 08:42:24 +0800 CST 2021-11-02 08:42:24 +0800 CST

Como fazer um redirecionamento nginx excluindo um endereço IP e um caminho?

  • 772

Preciso redirecionar para uma URL, a menos que o usuário esteja vindo de nosso endereço IP interno ou esteja acessando um caminho específico.

Eu tentei isso:

location ~* /foobar {
    break;
}

location ~* / {
    if ($remote_addr != 111.222.333.444) {
        rewrite ^ https://external.tld/
    }
}

Mas isso não parece funcionar. Essa configuração específica causa um 404 ao acessar https://mydomain.tld/foobar e um "Bem-vindo ao nginx!" página ao acessá-lo de dentro do nosso endereço IP. No entanto, acessar https://mydomain.tld/foobar fora do nosso endereço IP redireciona corretamente para https://external.tld/

nginx
  • 1 1 respostas
  • 337 Views

1 respostas

  • Voted
  1. Best Answer
    Ivan Shatsky
    2021-11-03T08:29:27+08:002021-11-03T08:29:27+08:00

    Como você não quer (ou não tem permissão) para mostrar seu bloco de servidor completo, farei algumas suposições. O que provavelmente aconteceu com sua configuração? Você criou dois blocos de localização adicionais que são usados ​​para processar qualquer solicitação recebida. Verifique a documentaçãolocation da diretiva . Os únicos dois tipos de local que podem ultrapassar uma solicitação do local de correspondência de regex são o local exato ( ) e o local do prefixo do-not-check-regex ( ). Caso contrário, o primeiro local de correspondência de regex será escolhido.location = /uri { ... }location ^~ /prefix { ... }

    Cada bloco de servidor tem seu diretório raiz, mesmo que não seja especificado explicitamente usando a rootdiretiva. É escolhido usando prefixo (especificado no momento da compilação , pode ser verificado com o nginx -Vcomando) e /htmlsufixo. Vamos supor que seu prefixo nginx seja /usr/share/nginx. Então sua raiz padrão estará no /usr/share/nginx/htmldiretório, a menos que especificado explicitamente usando a root /some/pathdiretiva.

    O comportamento padrão do nginx ao atender uma solicitação pode ser descrito como try_files $uri $uri/ =404.

    Vamos supor que temos um https://mydomain.tld/foobarpedido. Para servi-lo, seu primeiro location ~* /foobar { break; }será escolhido como o primeiro local de regex correspondente. A primeira diretiva breaksignifica que o processamento do conjunto atual de ngx_http_rewrite_modulediretivas será interrompido. Mas não há nenhuma dessas diretivas (exceto breakaquela) dentro deste bloco de localização! Sim, isso significa que esta breakdiretiva é inútil aqui. Em seguida, o nginx verificará a existência de um /usr/share/nginx/html/foobararquivo, um arquivo de índice do /usr/share/nginx/html/foobar/diretório (o padrão é index.html), e depois que ambas as verificações falharem, retornará um HTTP 404 Not Founderro.

    Agora vamos supor que temos um https://mydomain.tld/pedido. Seu primeiro bloco de localização não corresponderá a ele, então o segundo location ~* / { ... }é escolhido para processar essa solicitação (esse bloco de localização corresponderá a qualquer solicitação válida possível). Se uma verificação de endereço IP não for aprovada, um redirecionamento ocorrerá. Mas se passar, o nginx processará sua solicitação da mesma maneira descrita acima, retornando seu index.htmlarquivo de boas-vindas padrão do /usr/share/nginx/html/diretório.

    Parece que você não entende como as diretivas do ngx_http_rewrite_modulesão processadas. Leia novamente a primeira parte da documentação:

    As diretivas break, if, return, rewritee setsão processadas na seguinte ordem:

    • as diretivas deste módulo especificadas no nível do servidor são executadas sequencialmente;
    • repetidamente:
      • um local é pesquisado com base em um URI de solicitação;
      • as diretivas deste módulo especificadas dentro do local encontrado são executadas sequencialmente;
      • o loop é repetido se um URI de solicitação foi reescrito, mas não mais de 10 vezes.

    Você pode colocar suas verificações no nível do bloco do servidor:

    if ($uri = /foobar) {
        break;
    }
    if ($remote_addr != 111.222.333.444) {
        rewrite ^ https://external.tld/
    }
    

    A breakdiretiva acima funcionará como esperado, uma execução de ngx_http_rewrite_modulediretivas no nível do servidor será interrompida. Isso significa que qualquer outra diretiva desse módulo (como set, if, return, rewriteetc.), se houver, deve ser colocada antes do bloco acima. Isso não se aplica às ngx_http_rewrite_modulediretivas colocadas no nível de localização.

    Há mais uma ressalva possível. Se sua https://mydomain.tld/foobarpágina faz uso de algum recurso (scripts, estilos, imagens etc.), o acesso a esses recursos também deve ser permitido. Por exemplo, você pode alterar a condição para permitir qualquer coisa iniciada com /foobarprefixo usando if ($uri ~* ^/foobar) { break; }block. Se seus endereços não puderem ser verificados com um único regex, você poderá usar vários if (...) { break; }blocos.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve