如果文件名作为parameter passing不退出,则redirect到404

我在uri中有特殊的参数data=/path/to/filename.htm

它的老旧生锈的网站build在SSI上,我不能修改它。

问题是当文件名作为arg_data不存在,页面被破坏。

在这种情况下我想redirect到404.htm。

类似的东西:

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

但是我得到:

在处理“/404.htm”时重写或内部redirect周期

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

但是nginx没有嵌套if -s。

我试过了:

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

Idea将$data设置$data 100%存在的某个文件,并且在数据参数通过后重写。

由于某种原因,它给出了相同的错误,内部redirect周期

看起来我做错了。

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

NGinx无法做到这一点。

为了达到这个目的,我们将使用一个处理$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; } } 

好吧,这是一个非常奇怪的情况,你似乎是在正确的轨道上。

虽然我没有rewrite ,但会return 404; 并使用error_page来定义404错误页面。

例如:

 server { #...your other stuff... error_page 404 /404.htm; if (!-f $arg_data){ return 404; } }