Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nginx 配置之 if 指令

  一般的编程语言中 if 是最基本的语句之一。nginx 配置中也有 if,但它和一般编程语言的 if 完全不同。nginx 配置的 if 指令只是 rewrite 模块的一部分而已,它的使用是很有局限性的。能在 if 块中使用的指令只是 rewrite 模块中的那些和一些 proxy_pass 之类的特殊指而已。
  rewrite 模块虽然是 nginx 中最常用的模块之一,但它定义的指定并不多。
rewrite重置 $uri
return直接响应请求
set设置变量
if根据条件处理指令
break阻止进入其他 location
  还有两个不太常用的指令:
rewrite_log配置是否开启 rewrite 日志
uninitialized_variable_warn配置是否开启变量初始化日志
  这些 rewrite 模块中定义的指令都可以妥妥地用于 if 指令中。但如果把其它指令用在 if 指令中就会呵呵。比如我们希望判断请求头中的 Origin 来设置响应头中的 Access-Control-Allow-Origin。如果这么写就会呵呵,比如:
if ($http_user_agent ~ 'MSIE 6') { deny all; } nginx: [emerg] "deny" directive is not allowed here   因为 deny 指令是 access 模块中的指令,它并不能在 if 中使用。我们可以这么写
if ($http_user_agent ~ 'MSIE 6') { return 403; }   因为 return 是 rewrite 中的模块,它是可以在 if 中使用的。而且不仅是 rewrite 模块的这些指令,一些特殊的指令也是可以的,比如下面这个很常用的 CORS 配置: if ($http_origin ~ \.web-tinker\.com$) { add_header Access-Control-Allow-Origin $http_origin; }   add_header 虽然属于 headers 模块,但是它的定义中确实支持 if,这可以在文档的 add_header 部分中找到。除了 add_header,还有 proxy_passfastcgi_pass 等。
  if 指令的另一个问题是没有逻辑运算符,但这可以通过和 set 指令协作来解决。比如下面这段配置就是利用 if 指令来让百度蜘蛛访问 https 页面时 301 回 http 页面:
set $fallback ''; if ($http_user_agent ~* Baiduspider) { set $fallback 'x'; } if ($https = on) { set $fallback 'x$fallback'; } if ($fallback = xx) { return 301 http://$host$request_uri; }   最后给大家个忠告吧。if 指令的坑非常多,如果对它不是特别熟悉应该尽量避免使用。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^