如果你有遇到过较大规模的 Drupal 项目,但可能已经发现了当 files 目录过于巨大对开发所带来的巨大挑战。如何让开发服务器(或者你的个人电脑)与这些文件保持同步是件非常痛苦的事情,但如果不这样做,往往又会因为无法使用用户上传的文件或附件,使网站开发过程中的很多重要的问题无法被发现。
要解决这个问题有非常多的办法,但要么非常慢,要么非常复杂。例如使用Drush命令或者使用脚本程序将网站的文件下载后再上传到本地开发环境,甚至有人会考虑使用FTP执行这样的操作(请千万不要这样做)。尽管这些办法都能达到效果,但我还是希望能够节约宝贵时间和硬盘空间。
最开始我们找到了 Stage File Proxy 模块,它能够让 Drupal 将所有的文件请求都定向到线上服务器,即使网站是在本地运行时也可以有效工作。但是要让这个模块正常工作,需要对网站进行一些调整并安装额外的模块。所以,尽管这个模块可以解决问题,但我还是希望能有其它的方案。
之后,我们发现可以使用 Apache 的 URL重写规则来满足需要——当Apache程序在处理连入的网页请求时,重写规则允许它对满足指定规则的URL地址进行修改——例如,它可以将访问本地 files 目录的请求重定向到线上的服务器。
经过查找有关URL重写规则的帖子和教程,我们终于可以写出所需要的代码了。因为我使用 MAMP 进行开发,所以添加 Apache 配置代码片段比安装模块要简单得多。同时这个办法即不需要对修改网站设置,也不需启用新的模块。如果你不是使用 MAMP 作为开发环境,Apache重写配置代码的设置可能会略有不同。(译注:其实就是将以下配置代码片段粘贴到Apache网站配置部分)
以下便是让 Drupal 开发时使用远程文件的示例代码:
### Apache Rewrite
RewriteEngine on # Force image styles that have local files that exist to be generated. RewriteCond %{REQUEST_URI} ^/sites/([^\/]*)/files/styles/[^\/]*/public/((.*))$ RewriteCond %{DOCUMENT_ROOT}/sites/%1/files/%2 -f RewriteRule ^(.*)$ $1 [QSA,L] # Otherwise, send anything else that's in the files directory to the # production server. RewriteCond %{REQUEST_URI} ^/sites/[^\/]*/files/.*$ RewriteCond %{REQUEST_URI} !^/sites/[^\/]*/files/css/.*$ RewriteCond %{REQUEST_URI} !^/sites/[^\/]*/files/js/.*$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://www.example.com/$1 [QSA,L] |
如果你使用MAMP进行开发,打开MAMP,在高级面板的最下方找以“自定义虚拟主机设置”,将上面的代码粘贴进去后进行保存即可(注意将代码中的 example.com 修改成你自己的域名地址)。
最后,只需要重启Aapche便可以让 Drupal 本地开发的站点直接使用远程的文件,而我也可以让节省下来的硬盘空间来放更多的猫咪图片了。