Redirecionar para 404 se nome do arquivo passado como parâmetro não sair

3

Eu tenho um parâmetro especial data=/path/to/filename.htm in uri.

Seu site antigo e enferrujado foi construído sobre SSI e não posso modificá-lo.

O problema é quando o nome do arquivo transmitido como arg_data não existe, a página está quebrada.

Eu quero redirecionar para 404.htm neste caso.

Algo assim:

if (!-f $arg_data){
     rewrite ^.*$  /404.htm last;
   } 

Mas eu recebo:

rewrite or internal redirection cycle while processing "/404.htm

Acho que é porque não verifiquei o if arg_data .

Mas o nginx não aninhou if-s.

Eu tentei:

set $data index.htm;                                                                                                                                               
if ($args ~ "data=(.+)") {                                                                                                                                         
    set $data $1;                                                                                                                                                  
}                                                                                                                                                                                                                                                                                                                                          
if (!-f $data) {                                                                                                                                                
    rewrite ^.*$  /404.htm last;                                                                                                                                   
}                   

A ideia foi definida em $data para algum arquivo com 100%, e depois disso, reescreva se o parâmetro de dados foi passado.

Por alguma razão, é o mesmo erro, ciclo de redirecionamento interno

Parece que eu faço de maneira errada.

    
por Korjavin Ivan 23.02.2014 / 07:58

2 respostas

2

Ok, então em relação aos últimos comentários que tivemos, você precisa de uma condição AND para duas declarações if .

NGinx não é capaz de fazer isso.

Para conseguir isso, vamos usar um pequeno truque para lidar com $test var:

server {

  #...directives...

  error_page 404 /404.htm;

  if ($args != "") {                  # Test if there are some args       
     set $test A;
  }

  if (!-f /full/path/to/$arg_data) {  # Test if file in args doesn't exist
     set $test "${test}B";
  }

  if ($test = AB) {       # If there are some args AND if file doesn't exist
     return 404;
  }

}
    
por 24.02.2014 / 20:24
3

OK, este é um cenário muito estranho e você parece estar no caminho certo.

Em vez do rewrite , eu usaria return 404; e usaria um error_page para definir a página de erro 404.

Por exemplo:

server {

    #...your other stuff...

    error_page 404 /404.htm;

    if (!-f $arg_data){
        return 404;
    }
}
    
por 23.02.2014 / 19:33