问题描述
WordPress 似乎允许在 MU 安装中的许多 URI 处理内容。例如:
example.com/wp-content/blogs.dir/5/files/picture.jpg
example.com/bob/files/picture.jpg
example.com/bob/wp-content/blogs.dir/5/files/pictures.jpg
都显得路线到同一个地方。有更多的别名吗?哪一个是规范的?这些是偶然的吗?有相关的过滤器?
最佳解决方案
简答
example.com/bob/files/picture.jpg 是 WordPress Multisite 安装中图像的首选,规范的 URL 。 URL 中具有 blogs.dir
的两个 URL 基本相同,并且都利用了文件系统结构。存在’bob’ 的路径,因为您进行了 sub-directory 安装,而不是子域安装。其他路径将基于您的其他站点,例如 example.com/fred/wp-content/blogs.dir/5/files/pictures.jpg 。否则,不存在其他路径。
长回答
有很多人可以解释这个过程,我不是 100%确定你正在寻找的细节水平,所以我将在这里介绍基础知识。
WordPress Multisite 通过 blog_id
(“/blogs.dir/” 之后的”5”) 存储文件,以保持组织和分离不同网站的文件。此目录结构不是公开的。 WordPress 使用重写规则将^files/(.+)
路由到 wp-includes/ms-files.php?file=$1
,然后 wp-includes/ms-files.php
处理并输出图像和/或一些有用的标题。这有一些优点:
-
在安全性方面,信息越少越好。 “wp-content/blogs.dir/5″ 是一个小的 TMI – 它说你正在运行 WordPress 多站点,而
blog_id
是 5 。 -
URL 结构与 single-site 安装的结构相同。如果要将站点从 Multisite 安装迁移到自己的站点,则不必更新数据库中的这些引用,也不必更新外部引用的旧路径。
-
您可以通过
.htaccess
将文件目录移出公共访问或deny from all
,例如,如果您不想,则无法访问原始图像大小。 -
您可以将访问控制添加到特定文件
有一个主要的缺点,即图像/文件通过 PHP(甚至需要几个 MySQL 查询),因此需要更多的资源。如果您安装了一个缓存插件,额外的资源应该是可以忽略不计的。
关于过滤器,您不能轻易地过滤任何内容,原因如下:mu-plugins,插件或主题都不能加载*。最好的方法是在 wp-config.php 中覆盖常量。以下是可以覆盖的最有用/相关的常量:
if ( !defined( 'UPLOADBLOGSDIR' ) )
define( 'UPLOADBLOGSDIR', 'wp-content/blogs.dir' );
if ( !defined( 'UPLOADS' ) ) {
// Uploads dir relative to ABSPATH
define( 'UPLOADS', UPLOADBLOGSDIR . "/{$wpdb->blogid}/files/" );
if ( 'wp-content/blogs.dir' == UPLOADBLOGSDIR )
define( 'BLOGUPLOADDIR', WP_CONTENT_DIR . "/blogs.dir/{$wpdb->blogid}/files/" );
}
/**
* Optional support for X-Sendfile header
*/
if ( !defined( 'WPMU_SENDFILE' ) )
define( 'WPMU_SENDFILE', false );
/**
* Optional support for X-Accel-Redirect header
*/
if ( !defined( 'WPMU_ACCEL_REDIRECT' ) )
define( 'WPMU_ACCEL_REDIRECT', false );
*即使插件没有加载,drop-ins 也可以。因此,当您不能使用标准插件时,WordPress 仍然为您所需要的任何事情打下基础,如上述 (如上所述) 向敏感文件添加访问控制。 drop-in sunrise.php
将是添加此类代码的好地方。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。