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