Nginx,不使用 IF 检查请求方法?

Nginx,不使用 IF 检查请求方法?

我正在尝试优化我的 Nginx 配置,但遇到了一个我不知道如何修复的问题。/images我的服务器上有一个文件夹,我从中为网站提供各种静态文件。不过,这个文件夹也用于通过 WebDAV 上传文件。

因此,我必须检查每个请求是否存在静态文件,并且如果请求方法是GET,我会传递文件。否则,我假设该请求与 WebDAV 相关(例如 PUT 等)。请参阅此示例:

if ($uri ~* ^/images)         { set $getimages "${getimages}A"; }
if ($request_method = GET)    { set $getimages "${getimages}B"; }
if ($getimages = "AB") {
    rewrite ^ $uri$args last;
}

上面的示例运行良好。但我想知道是否有其他方法可以做到这一点,而不使用 IF。鉴于IfIsEvil 参考在 Nginx Wiki 中

有人有想法吗?

答案1

重新发布评论波蒂作为CW

If不是邪恶的,如果在块外使用location!即使在块内,它也可以与和指令location一起使用!returnrewrite

来自 IfIsEvil 页面的片段

指令在上下文if中使用时会出现问题location,在某些情况下,它不会按照你的预期执行,而是执行完全不同的操作。在某些情况下,它甚至段错误。如果可能的话,最好避免这种情况。

在上下文中可以做的唯一 100% 安全的事情location是:

return ...;
rewrite ... last;

其他任何事情都可能导致不可预测的行为,包括潜在的错误信息

相关内容