使用wordpress建立文件共享站
原因
开设网站,最讨厌的事情就是网站的图片等静态资源被其他网站盗用。最简单的办法就是使用防盗链。由于我的网站从一开始是使用EasyPanel面板的虚拟主机建设的,所以没想过那么多,导致网站上图片的url和实际访问的url是同样的域名,使用防盗链白名单的话(并且不允许空Referer来源的话),所有访客就不要想登录了。
突然想到萌娘百科上传文件的时候,需要到名为萌娘共享的站点上传文件,才可以在百科的条目中插入图片,于是决定也建立一个用于存放静态文件(比如图片)的文件共享站点。
选择
选择新建wordpress网站作为文件共享站点是出于以下考虑:
- 我的博客站点就是wordpress,修改图片链接方便
- wordpress有现成的导入和导出插件(准确说是导入有个插件),这样方便传输原有数据。如果后期不想使用共享站了,数据迁移回原站也方便。
- 如果后续迁移回主站,(或者落魄了用Linux类型的“虚拟主机”),只要将资源共享的域名301到主域名,或者直接绑在和主站同样的路径下,文件依然能被访问。
如果是一个新建站点,在不缺钱的情况下,我个人建议使用腾讯或者阿里的对象存储(cos/oss),这些大厂的对象存储都有三方wordpress插件直接对接,将上传的图片自动更新到对象存储中,并且使用cdn分发。
如果是使用腾讯云的wordpress应用镜像,腾讯甚至集成了官方的插件(他真的,我哭死.jpg)(腾讯云官方插件:对象存储 将 WordPress 远程附件存储到 COS-最佳实践-文档中心-腾讯云 (tencent.com))
当然,现在也有很多开源的图片管理工具,可以去搜索一下。
安装
注意:这里我使用的wordpress版本是6.4.3
安装wordpress,这就不多说了,我选择是从官网下载安装包,然后解压,之后正常安装wordpress。
在填写数据库的地方,数据库库名和原站同数据库,但是表前缀和原站数据库不同。wordpress默认的表前缀是wp_
只要改成和原站不同的即可。
当然,如果做两个站点分开使用,其实正常安装就可以,不用这样麻烦。
同步数据库
现在,wordpress安装好了。原则上可以当作一个简单的资源站使用了。但是我希望两个站点可以使用同样的账户登录,所以需要修改wordpress的配置(这也就是为什么我要把两个wordpress安装在同一个数据库里面的原因)。
初始安装完成wordpress,会出现11张表:
commentmeta
: 存放评论附加数据comments
: 存放博客文章和其他内容的评论links
: 存放链接数据options
: 存放网站的全局选项(比如说网站首页url)、插件和主题的信息postmeta
: 存放文章、页面、媒体文件等Post类型的附加数据posts
: 存放所有的文章、页面等Post数据terms
: 存放所有的分类信息term_relationships
:存放页面等文件和分类之间的关系term_taxonomy
: 存放分类的具体类型和其附加信息usermeta
: 存放用户账户的所有数据users
: 存放所有用户账户的信息
由于数据库涉及敏感信息,下面我就不放图片了,举个例子:假设原来的站点的表前缀是:example1_
,新建的文件站的表前缀是:example2_
,想要新站点使用原站点的用户数据,即要修改新站点的wordpress配置文件。
已经安装好的wordpress的配置文件是网站根目录下的:wp-config.php
文件,在其中添加上:
define('CUSTOM_USER_TABLE', 'example1_users');
define('CUSTOM_USER_META_TABLE', 'example1_usermeta');
这时候,已经可以使用原站点的账号密码登录新站点了,但是没有权限登录新站点的后台。
然后修改一下表example1_usermeta
,为这个表格添加一行数据:
INSERT INTO `test`.`example1_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'example2_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');
因为我的网站只有我自己使用,只有一个用户,所以用户id是1。如果不是,则需要输入对应的用户id(user_id
)和权限(meta_value
)。用户id可以到原站查找,权限可以去新站点对应的表找。
这样,两个站点的用户数据就同步了。
导入数据
因为是文件站,存放的是原网站的媒体文件,所以在原网站的:工具 - 导出 中选择媒体,选择导出数据的时间。
在新网站的:工具 - 导入 中,选择wordpress,初次使用可能需要安装一下
记得勾选下载文件哦。
这样,数据就导入成功了。
建议安装的插件
因为是文件站点,主要的文件大多数还是图片,加上中文语言环境下容易出现奇怪的错误,所以可以安装两个方向的插件:文件名称自动转英文插件和图片优化插件。
我选择的插件如下:
- 文件名称自动转英文:Wenprise Pinyin Slug – WordPress 插件 | WordPress.org China 简体中文
- 图片优化插件:Converter for Media – 优化图像 | 转换为 WebP 和 AVIF 格式 – WordPress 插件 | WordPress.org China 简体中文
删除不必要的菜单
由于是文件站,所以我优化了一下菜单栏的显示,隐藏了不必要的入口,效果如下:
如果想要实现,可以在使用主题的function.php
加上如下内容:
function disable_media_libraryn() {
remove_menu_page('edit.php');
remove_menu_page('edit.php?post_type=page');
remove_menu_page('edit-comments.php');
remove_menu_page('users.php');
remove_menu_page('themes.php');
remove_menu_page('tools.php');
remove_menu_page('options-general.php');
remove_menu_page('plugins.php');
remove_menu_page('index.php');
}
当然,在原网站我也移除了媒体库:
function disable_media_library_uploads() {
remove_menu_page( 'upload.php' );
global $pagenow;
if ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) {
remove_action( 'media_buttons', 'media_buttons' );
}
}
考虑到后续会使用防盗链,所以我也做了提示(因为我会打开不允许空Referer来源,所以一定要有Referer):
function show() {
?>
<div class="notice notice-warning">
<p><?php _e('上传媒体附件到文件共享站:xxxxx <a href="url" target="_blank">【上传文件】</a> 直接打开无效,必须点击链接,账号密码和本站点通用。', 'textdomain'); ?></p>
</div>
<?php
}
由于是编辑主题的
function.php
,所以主题更新的时候会修改,可以使用子主题,也可以关闭自动更新然后手动更新。
同步会话
我希望在博客站点登录之后,文件站也会自动登录。没有选择sso,选择共享cookies。
首先在wordpress的配置文件中(wp-config.php
)往下翻有一段“乱码”,这是wordpress的验证密钥。
中文版的验证密钥注释如下:
* 身份认证密钥与盐。
*
* 修改为任意独一无二的字串!
* 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org密钥生成服务}
* 任何修改都会导致所有cookies失效,所有用户将必须重新登录。
*
* @since 2.6.0
*/
将原站点和新站点的身份密钥统一(复制任意一边的就行),然后添加如下内容:(两个站点都要加)
define('COOKIEPATH', '/');
define('COOKIE_DOMAIN', 'example.com');
define('SECRET_SALT', '00001111-22223333-44445555-66667777');
define('ADMIN_COOKIE_PATH','/');
define('SITECOOKIEPATH', '/');
define('COOKIEHASH', md5( '00001111-22223333-44445555-66667777'));
最后大致是这样的效果:
更多
基本上就完成了,之后可以配置cdn,视情况配置cdn(如果开白名单模式,不要忘记把文件站点的域名也添加上白名单。)
:-)