我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
无法做到这一点。
为了实现这一点,我们将使用一个处理$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;
}
}
答案2
好的,这是一个非常奇怪的场景,你似乎走在正确的轨道上。
不过rewrite
,我不会return 404;
使用 ,而是使用error_page
来定义 404 错误页面。
例如:
server {
#...your other stuff...
error_page 404 /404.htm;
if (!-f $arg_data){
return 404;
}
}