Web 技术研究所

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

nginx 配置之 内部重定向

  nginx 的 location 指定不仅可以定义匹配 path 的配置,还可以定义以「@」开头的内部重定向。我们经常会遇到多个 location 处理的最终结果是一样的情况,比如 php 程序最终会配置一堆参数后丢给 fastcgi_pass 处理,这时候使用内部重定向就可以减少重复的配置。
  比如对特定的目录或路径开启 php 支持可以这么写(此处使用 php-fpm 作为服务器)
location /a { try_files '' @php; } location /b { try_files '' @php; } location @php { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; break; }   try_files 指令是让路由进入内部重定向最方便的形式了。虽然 try_files 的本意是检测某个文件是否存在并访问,最终再 fallback 到一个地方(所以上面 try_files 的例子中第一个参数是空字符串,也就是先尝试寻找名为空字符串的文件,必然找不到)。除了 try_files 之外,其实可以把内部重定向也视为一个普通的路由,使用 rewrite 来跳转,比如这样 location /test { rewrite / @test; } location @test { return 200 $uri; }   虽然最终路由也进入了 @test,但由于使用了 rewrite,所以丢失了 $uri。于是这个例子中输出的 $uri 就是 @test 这货。对于一些不依赖 $uri 又不想 try_files 的跳转可以试着这么干(但是我还是比较倾向于使用 try_files 的)。
  最后我在网络上还看到一种猥琐的跳转方式,强行造一个错误,使用错误页来触发内部重定向。比如
error_page 599 = @test; location /test { return 599; } location @test { return 200 $uri; }   虽然在 /test 中是 return 599 这个异常,但由于全局的 599 自定义错误的页面被指向了 @test,所以最终又会进入 @test,得到 return 200 $uri 的结果。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^