Chinaunix首页 | 论坛 | 博客
  • 博客访问: 495574
  • 博文数量: 51
  • 博客积分: 257
  • 博客等级: 二等列兵
  • 技术积分: 1489
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-02 18:30
个人简介

Unix/Linux, mysql, web,企业应用

文章分类

全部博文(51)

文章存档

2015年(1)

2014年(1)

2013年(48)

2012年(1)

我的朋友

分类: PHP

2013-08-19 16:46:15

文章已迁移到: 
如题,一般静态文件的下载是不经过PHP的,直接由web服务器发送到客户端。但有时候需要实现文件下载的权限控制等功能,这时候就需要经由PHP程序来做权限验证。简单粗暴的做法是,在PHP程序里边先验证权限,验证通过后再读取文件内容发送给客户端。这种做法确实可以满足需求,但是很明显的,由PHP来发送静态文件内容远远不如直接由web服务器发送静态文件高效,而且会占用更多的资源。怎样既可以实现动态权限验证,又可以高效的发送静态文件呢?像这种需求肯定不是个例,而且也相当的普遍。于是,便有了 Apache 的mod_xsendfile 模块,以及 nginx的 X-accel。

Apache mod_xsendfile 模块首页:在Debian里,直接 apt-get install libapache2-mod-xsendfile 就可以安装这个模块了。
注意在Debian6里,apt仓库里xsendfile 模块的版本是0.9,而 XSendFilePath、XSendFileIgnoreLastModified 以及 XSendFileIgnoreEtag 指令是在0.10版本引进的。所以在0.9版本里使用XSendFilePath指令会出现“Invalid command 'XSendFilePath', perhaps misspelled or defined by a module not included in the server configuration”的错误,解决办法是使用0.9版引进的 XSendFileAllowAbove 指令,或升级 xsendfile 模块到最新版(建议升级版本)

nginx X-accel 首页:
nginx不需要安装额外的模块,直接配置就行了。
注意在nginx里,当设置了 X-Accel-Redirect 头之后,nginx会删除掉后端应用自定义的头部(如 X-Abc-Def ),只保留一些特殊的后端应用设置头部(如 Content-Type、Content-Disposition等),这样就没办法向客户端发送自定义响应头了。为了避免这种情况的发生,需要做一些设置:

  1. location /protected/ {
  2.     internal;
  3.     root /opt/www/files/;
  4.     add_header X-Abc-Def $upstream_http_x_abc_def;
  5. }
注意是 $upstream_http_x_abc_def ,而不是 $upstream_x_abc_def
这样就既能告知 nginx 代为发送静态文件,也能发送自定义 http 响应头了


(未完待续。。。)
阅读(7709) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~