本地开发,使用生产环境中的图片

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

在本地开发网站意味着将使网站运行的文件存储在您的计算机上。这些文件通常保存在版本控制库中。您可以在本地进行开发,并在准备好后将更改推送到库中。其他人员也可以进行开发,并将他们的更改拉取到本地。

版本控制库中可能不会包含来自 CMS 的图片文件。WordPress 就是一个典型的例子。当您在 WordPress 中上传图片时,它会进行一系列操作。它会将图片上传到 `uploads` 文件夹,创建多个版本,甚至更新数据库,并添加附件元数据。但是,它不会进行版本控制提交,也不会包含所有这些文件。

您可以通过多种方式确保拥有这些文件。您可以编写脚本将它们拉取下来,或者定期手动 FTP。在 WordPress 领域,有一些插件可以提供帮助,例如 WP DB Migrate Pro,它不仅可以迁移数据库,还可以迁移图片。

但您可能并不想处理图片。也许

  • 您不想将图片放在版本控制库中。也许版本控制库只是一个主题文件夹,最好保持现状。
  • 您有大约 10 GB 的图片,移动它们既不切实际也不必要。

我认为这完全合理。一个类似出版物的网站可能不需要将他们上传过的所有图片都包含在他们的主要版本控制库中。

好了,解释就到这里。您应该理解了。

Sean Lange 在 2013 年的文章 本地开发时使用远程图片文件 中提到了这个问题。他的解决方案是在 Web 服务器级别重写本地 URL 以指向生产文件。

我在 Apache URL 重写规则中找到了答案。当 Apache 程序处理传入的网页请求时,重写规则允许它更改与特定模式匹配的 URL - 例如,它们可以将对您本地机器上“files”目录的请求转换为对生产服务器上远程 URL 的请求。

这是他的 Apache 重写规则

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 使用 Drupal,但只要您在本地使用 Apache,这都是同一个想法的变体。匹配指向您要定位的资源的 URL,并将它们重写到实时站点。

他能够将这些规则粘贴到 MAMP 中处理它的一个小方框中。我在通过一个小型的 Docker 设置在本地运行 WordPress,因此我直接编辑了我的 `.htaccess` 文件,并为我的需求简化了一些内容。

RewriteCond %{REQUEST_URI} ^/wp-content/uploads/[^\/]*/.*$
RewriteRule ^(.*)$ https://css-tricks.org.cn/$1 [QSA,L]

对我来说效果很好!这里有一个视觉解释