自己在家里的黑群晖上建了个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