2011年10月

最近的一个Drupal项目中,要用到Drupal 7 的Image Style(也没有哪个项目不用这个东西吧?),以前一直都是使用 Apache服务器,还没出现什么问题,原因可能是因为Drupal默认就对Apache有更好的支持吧,在 .htaccess 文件中可能已经提供了规则,但是在Nginx中,因为并不是原生的Rewrite Rule,所以还是会出现问题的。

Drupal 7 中的Image Styles可以让我们上传一张图片,在不同的地方得到各种各样不同大小和效果的图片,它可以对图片进行去色,翻转,改变大小,裁切等各种基本操作,但是前提是,我们需要通过 Drupal 去访问这些图片,而不是直接访问图片在服务器上的URL地址,比如:http://www.lorecore.net/media/default/images/2011-11/1.jpg 这样图片,如果我想在想要调用它的 large 样式的复本,那么通过 Image Style的地址应该是下面这样的:

http://www.lorecore.net/media/default/images/styles/large/public/images/2011-11/1.jpg

这样访问在Apache中应该是没有问题,但是在Nginx中,可能根本就访问不到,我也是整了一整天,最后发现一个问题,在我的MAMP 里面,在处理这种图片的时候,PHP会产生Error,但是在我的VPS上面,却没有这个Error,当我把MAMP中的问题处理完了之后,Image Style可以正常工作了,但是在VPS上面,因为没有产生Error,那么很有可能就是:访问Image Style处理之后的图片,必须经过 Drupal ,而不能直接从服务器上下载。

这是因为Drupal的Image Style访问的图片会将起重写到 /?q=/media/default…. 这样的地址,而并不是直接让Apache来返回的,而Nginx因为没有相关的Rewrite Rule,所以并没有将静态文件的访问转到 Drupal 上,要修复 Drupal 在Nginx上面的这个问题,我们只需要让访问Image Style的Cache目录的图片的时候,都将其Rewrite到Drupal上即可,在Nginx的配置文件中加入如下代码:

location ^~ /media/default/styles/ {
index index.php index.html;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}

上面的代码,可以让对 /media/default/styles/ 这个目录下所有文件的请求都Rewrite到 /?q=/media/default/styles/.. 上,在你的项目中,需要将 “/media/default/styles/” 修改成为你自己的 Styles Image Cache 目录,比如如果你使用的是Drupal默认的文件路径,那么应该是 “/sites/default/files/styles/”。