如果作为参数传递的文件名不存在,则重定向到 404

如果作为参数传递的文件名不存在,则重定向到 404

data=/path/to/filename.htm在 uri 中有一个特殊参数。

它是基于 SSI 构建的古老而生锈的网站,我无法修改它。

问题是,当作为 arg_data 传递的文件名不存在时,页面就会损坏。

在这种情况下,我想重定向到 404.htm。

类似这样的:

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

但我明白:

处理“/404.htm”时重写或内部重定向循环

我认为这是因为我没有检查if arg_data是否存在。

但是nginx没有嵌套的if-s。

我试过:

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

想法是将$data某个 100% 存在的文件设置为,然后如果传递了数据参数则重写。

由于某种原因,它给出了相同的错误,内部重定向循环

看来我做错了。

答案1

好的,关于我们最后的评论,您需要AND两个if语句的条件。

NGinx无法做到这一点。

为了实现这一点,我们将使用一个处理$testvar 的小技巧:

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;
  }

}

答案2

好的,这是一个非常奇怪的场景,你似乎走在正确的轨道上。

不过rewrite,我不会return 404;使用 ,而是使用error_page来定义 404 错误页面。

例如:

server {

    #...your other stuff...

    error_page 404 /404.htm;

    if (!-f $arg_data){
        return 404;
    }
}

相关内容