由于新浪云不支持在代码目录进行IO操作,这意味着发表文章不能上传媒体文件。解决这个问题,就是将wordpress的uploads映射到SAE的Storage分布式文件存储服务。
1. 问题描述
尽管已经将wordpress本地源码上传到新浪云,也可以通过独立域名访问,详情见博文《在新浪云搭建wordpress博客:从本地源码到独立域名访问》,但使用过程会遇到一个严重问题,即没有uploads
目录的写权限,比如在主题设置上传背景图像(上传到uploads
目录),提示如下错误:
Unable to create directory wp-content/uploads/2015/04. Is its parent directory writable by the server?
2. 解决方法
由于SAE不支持IO操作,上传的代码目录没有写入权限[1],这意味着不能上传媒体文件,因为媒体文件存储目录是wordpress/wp-content/uploads/
。SAE把IO操作交由MemcacheX、Storage分布式文件存储服务来做。那好,解决办法就是修改wordpress代码,将uploads
映射到Storage
。幸运的是,已有人分享了如何修改代码,见百度经验《WordPress中uploads目录替换为SAE的Storage方法》,摘抄如下:
(1)创建文件sae.php
在代码版本的根目录(注:不是应用目录)下创建文件sae.php
,源码如下:
<?php /* 在SAE的Storage中新建的Domain名,比如“wordpress” */ define ( 'SAE_STORAGE', wordpress ); /* 设置文件上传的路径和文件路径的URL,不要更改 */ define ( 'SAE_DIR', 'saestor://' . SAE_STORAGE . '/uploads' ); define ( 'SAE_URL', 'http://' . $_SERVER ['HTTP_APPNAME'] . '-' . SAE_STORAGE . '.stor.sinaapp.com/uploads' ); ?>
(2)修改wp-includes/functions.php
文件
/*** Step 1: include sae.php ***/ include( ABSPATH . '/sae.php' ); //添加这一行。调用SAE的Storage文件域名设置 require( ABSPATH . WPINC . '/option.php' ); //在这一行之前添加 /*** Step 2: 替换代码 ***/ /* $wrapper = null; // Strip the protocol. if (wp_is_stream ( $target )) { list ( $wrapper, $target ) = explode ( '://', $target, 2 ); } // From php.net/mkdir user contributed notes. $target = str_replace ( '//', '/', $target ); // Put the wrapper back on the target. if ($wrapper !== null) { $target = $wrapper . '://' . $target; } */ //替换为以下代码 // from php.net/mkdir user contributed notes if (substr ( $target, 0, 10 ) == 'saestor://') { return true; } $target = str_replace ( '//', '/', $target ); /*** Step 3: 添加代码 ***/ $dir = SAE_DIR; //添加这一行 $url = SAE_URL; //添加这一行 $basedir = $dir; /*** Step 4: 添加代码 ***/ //添加如下代码块 if ( !function_exists('utf8_encode') ) { function utf8_encode($str) { $encoding_in = mb_detect_encoding($str); return mb_convert_encoding($str, 'UTF-8', $encoding_in); } } //在这前面添加上述代码 /** * Send a HTTP header to limit rendering of pages to same origin iframes. * * @since 3.1.3 * * @see https://developer.mozilla.org/en/the_x-frame-options_response_header */
(3)修改wp-admin/includes/file.php
/*** 注释如下代码 ***/ // Set correct file permissions. $stat = stat ( dirname ( $new_file ) ); $perms = $stat ['mode'] & 0000666; @ chmod ( $new_file, $perms );
修改完成,再次提交代码,问题解决。关于新浪云Storage
操作,可以参考官方文档的Storage部分。
3. 下载uploads内容
uploads
是存在Storage
,不能用git下载,进入Storage
,也没有下载选项。下载uploads
,需要安装Cyberduck,建立链接,操作示意图如下(详情见官方文档,这里):
类型:Swift。
服务器:auth.sinas3.com
端口:443(默认)
用户名:应用AccessKey(在应用“汇总信息”页面中查看)
密码:应用SecretKey(在应用“汇总信息”页面中查看)
4. 其他问题
(1)svn … is already locked
提交代码时,若因“svn … is already locked”错误而不能提交。解决方法:右击项目 –> Team –> Refresh/Cleanup,然后再commit
就可以了。
(2)The requested URL *** was not found on this server
访问非主页页面时,提示如下错误:
Not Found
The requested URL /just-for-test/ was not found on this server.
解决方法,在config.yaml
文件添加如下两行,重新提交代码[2]:
handle: - rewrite: if (!is_file() && !is_dir() && path ~ "^/(.*)") goto "index.php/$1"
参考资料:
[1]博文《SAE 搭建 Discuz》
[2]博文《sae版的wordpress中的固定链接设置失败导致404解决大全》
微信赞赏
支付宝赞赏
Pingback: 搭建这堆积木,我认真了好几天 | Hi, Rowan
Pingback: 来SAE搭一个WordPress博客吧~ – 政子的博客
Pingback: 批量搭建wordpress站点:修改url、博客名称、博客描述、用户名Spark & Shine | Spark & Shine
Pingback: 在新浪云搭建wordpress博客:从本地源码到独立域名访问 | Spark & Shine