wordpress

wordpress踩坑

admin · 7月31日 · 2020年

自己在家里的黑群晖上建了个wordpress,又搞了GG的300美元体验券,一种莫名的想法突然涌出

大致思路是这样的,家里带宽很足,但是没有80,443端口,所以用VPS反向代理解决

为什么不直接放VPS上?

鬼知道哪天GG就被屏蔽了,用一天是一天

1.wp-config.php多域名支持

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
define( 'WP_CONTENT_URL', '/wp-content');

2.nginx反向代理

wordpress 上的链接不少是绝对路径,直接写一个proxy_pass的话只能代理到主页
进去随便点个链接就404了,所以要使用sub_filter进行文本替换
------------------------------------------------------------------------
 location /{
        proxy_set_header  Accept-Encoding  “”;
        proxy_pass https://blog.xxxxxxxxxxxx.cn:88;
        sub_filter https://blog.xxxxxxxxxxxx.cn:88 https://xxxxxxxxxxxx.cn;
        sub_filter_once off; 
    } 
用https://xxxxxxxxxxxx.cn;替换https://blog.xxxxxxxxxxxx.cn:88
------------------------------------------------------------------------
以上可以解决使用nginx对wordpress反向代理时由于绝对路径造成的404问题
proxy_set_header  Accept-Encoding  “”; 这一项可以让nginx 不发送 Accept-Encoding HTTP header。
这个时候,wordpress 返回的页面是不做gzip压缩的。因为gzip 压缩之后,文本替换就会失效了

------------------------------------------------------------------------
                                  更新
------------------------------------------------------------------------
wordpress迁移至docker后没有这个问题,群晖的web服务器一段时间后会还原,配置的跨域就失效了

3.rest api 跨域问题

反向代理搞好了,可是进去页面一直右下角提示rest api服务器连接错误,什么鬼
查了半天,rest api 跨域问题,好吧

在主题的functions.php文件内添加
------------------------------------------------------------------------
function add_custom_headers() {
add_filter( 'rest_pre_serve_request', function( $value ) {
        header( 'Access-Control-Allow-Headers: Authorization, X-WP-Nonce,Content-Type, X-Requested-With');
        header( 'Access-Control-Allow-Origin: *' );
        header( 'Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE' );
        header( 'Access-Control-Allow-Credentials: true' );
        return $value;
    } );
}
add_action( 'rest_api_init', 'add_custom_headers', 15 );
------------------------------------------------------------------------
以上代码允许rest api跨域

4.伪静态实现

心血来潮修改wordpress固定链接为自定义后,点开文章直接404,这次连本地链接都404了,明显是固定链接的问题
好吧,作为一名面向百度的运维工程师,这点小问题怎么可能难倒我

修改nginx配置文件
DSM路径为:
/etc/nginx/app.d/server.webstation-vhost.conf
------------------------------------------------------------------------
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
------------------------------------------------------------------------
PS:在DSM中会遇到如下坑
设置的有每天固定时间备份整个DSM,但奇怪的是备份完成后server.webstation-vhost.conf会还原
不清楚什么原因,干脆写个脚本把这段作为include加进去算了

整个检测脚本,设置每10分钟自动运行一次
------------------------------------------------------------------------
#!/bin/bash
TIME=`date +"%Y-%m-%d %T"`
CONFIG_PATH="/etc/nginx/app.d/server.webstation-vhost.conf"
LOG="/volume1/homes/admin/DSM.shell/wordpress/log.wordpressmod.log"
chmod a+w $CONFIG_PATH
CHECK_KEYWORD=`cat $CONFIG_PATH | grep -o "patch.wordpress.conf"`
LOG_NUM=`cat $LOG | wc -l`

function newinclude() {
cat > /volume1/homes/admin/DSM.shell/wordpress/patch.wordpress.conf <<"EOF"
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
EOF
}

if [ "$CHECK_KEYWORD" == "patch.wordpress.conf" ];then
echo "$TIME :no change" >> $LOG
else  
newinclude
sed -i '19a \    include /volume1/homes/admin/DSM.shell/wordpress/patch.wordpress.conf;' $CONFIG_PATH >/dev/null 2>&1
/bin/nginx -s reload
echo "$TIME :changed" >> $LOG
fi
if [ "$LOG_NUM" -gt "1000" ];then
{
sed -i '1d' $LOG >/dev/null 2>&1
}
fi

5.已迁移到docker

群晖自带的web station问题很多,已经将wordpress迁移至docker