技术解析

请教一个 nginx 301 只添砖网站下特定目录的一个问题。。。wordpress 程序。。。
0
2021-05-21 03:47:14
idczone
我有个网站 http://www.a.com 访问显示图片时,图片的引用地址时 http://www.a.com/wp-content/uploads/xxx.jpg 现在我想首页还是 http://www.a.com 但调用图片时,我希望能自动大带宽服务器引用 https://cdn.a.com/wp-content/uploads/xxx.jpg

之前用的 nginx 正则表达式是:
location ~* ^/wp-content/uploads/ {
rewrite ^/wp-content/uploads/(.*)$ https://cdn.s.com/wp-content/uploads/$1 permanent;
}

以及:
location / {
if ($host = "www.a.com/wp-content/uploads/"){
rewrite ^/(.*)$ https://cdn.a.com/wp-content/uploads/$1 permanent;
}

这两种设置 并重启 nginx 后,我访问首页还是没有不变化。。。请问该怎么做呢?



求高人指点。。。
用插件吧,比如 w3-total-cache,有相关设置

因为这个 rewrite 是内部 rewrite 啊
建议使用 wp 的相关插件,会自动替换输出
或者使用 sub_filter 和 subs_filter 不过有各种麻烦,没经验还是上插件吧

$host = "www.a.com/wp-content/uploads/"
这个条件不对,$host 只包含访问过来的域名,不带路径,所以这个条件永远不会被匹配上

w3 必须要开启 ftp 才可以,我之前就是开了 ftp,但现在 ftp 有点纠结不能用了,所以需要换掉。。。
有合适的插件吗?一只木有找到

我根据你的改了,但还是不行,麻烦能看看还需要哪里改吗 T_T
location ~* ^www.a.com {
rewrite ^/wp-content/uploads/(.*)$ https://cdn.s.com/wp-content/uploads/$1 permanent;
}

反正我 w3 没开过 FTP 用的好好的,lnmp

不开 ftp 怎么设置二级域名呢?

不是不是,有些混乱,我跟你细说一些
做重定向,nginx 有两种方法,你说的那两种方法都可行。只是匹配的条件没写对而已
一种方式:直接使用 location 的正则匹配,然后 rewrite
第二种方式:通过 if 语句结合正则判断路径,然后 rewrite
个人觉得只通过 location 就足以实现你想要的
我给你个网上的例子,实测了下是可以的
例子中匹配的扩展名有些多,如果你只是 jpg 的,就保留 jpg 就可以。
location ~ ^/wp-content/uploads/.*.(jpe?g|gif|css|png|js|ico|pdf|m4a|mov|mp3)$ {
rewrite ^ http://cdn.domain.com$request_uri? permanent;
}
测试:( location 已经能被转发了,只需要替换你自己的 cdn 域名就可以了)
curl -I 127.0.0.1:8000/wp-content/uploads/test1.jpg
HTTP/1.1 301 Moved Permanently
Server: openresty
Date: Fri, 19 May 2017 14:49:04 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: http://cdn.domain.com/wp-content/uploads/test1.jpg


还有啊,我把你的配置上,直接测试,也是可以的啊
比如这个:
location ~* ^/wp-content/uploads/ {
rewrite ^/wp-content/uploads/(.*)$ https://cdn.s.com/wp-content/uploads/$1 permanent;
}
测试:
curl -I 127.0.0.1:8000/wp-content/uploads/test1.jpg
HTTP/1.1 301 Moved Permanently
Server: openresty
Date: Fri, 19 May 2017 14:58:08 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://cdn.s.com/wp-content/uploads/test1.jpg
都 OK 的啊

直接上插件 CDN Enabler,你这方案太不优雅了。。。哪有 301 到 CDN 的。。。

牛头不对马嘴,你这还是 CDN 么?自己一个 301
凭什么设置二级域名要 FTP。服务器配置文件直接写就好了,这年头还有谁用 FTP 的?你可能是 Web 目录没开写权限,暂时开一下,设置完了再关

没理解和 cdn 啥关系? 楼主不就是要一个跳转么?

```// CDN
function qiniu_cdn($buffer){
$cdnstr = '//oh8ipvbpu.qnssl.com';
$buffer = str_replace(array(get_stylesheet_directory_uri()), $cdnstr . '/wp-content/themes/' . get_template(), $buffer);
$buffer = str_replace(array(includes_url( '/js/')), $cdnstr . '/wp-includes/js/', $buffer);
$buffer = str_replace(array(plugins_url()), $cdnstr . '/wp-content/plugins', $buffer);
$buffer = str_replace(array(wp_upload_dir()['baseurl']), $cdnstr . '/Upfiles', $buffer);
return $buffer;
}

// 打开缓冲区并送出缓冲区内容
function qiniu_cdn_flush(){
ob_start("qiniu_cdn");
if(ob_get_level() > 0) ob_flush();
}

// 清除缓冲区
function qiniu_cdn_clear(){
if(ob_get_level() > 0) {
ob_end_clean();
}
}

// 根据情况加载函数
if ( is_admin() ) {
if (ob_get_level() > 0) {
do_action('admin_init', 'qiniu_cdn_clear');
}
} else {
add_action('after_setup_theme', 'qiniu_cdn_flush');
}```

js css 还可以弄 static 你这弄啥 cdn 啊 你这方案太不优雅了+1

谢谢两位,但我这里居然都失败 T_T
国内云主机带框太贵,才 1m,我又一个地方是双线联通+电信,各 20m 的,所以想吧图片都放过去。。。CDN Enabler 试过了,无效。。。不知道要不要修改哪里。。。
谢谢,w3 的插件我把 ftp 信息去掉了,第一次知道原来可以这样用 T_T 不过想请教下,我是因为有双线 20m 带宽的机器,想把 uploads 目录放到那个机器上。但现在还有个问题,我在 wordpress 上传图片后,如果不是通过 w3 的 ftp 远程附件,还有什么办法可以把这些图片导入到远程 cdn 服务器上的 uploads 目录吗? 我试过 rsync,但只能设定时间扫描文件是否有修改再上传。。。由于我图片较多,我设置 3 秒扫描一次,又怕这样服务器会死很惨 T_T

看你用的哪家了,很多 CDN 是有镜像 /pull 模式的,设置一个专用的二级域名,对方会给你反代并缓存
其他的一般有上传接口,可以在 w3 里配置自动上传,具体情况具体讨论

你用的专有 cdn 啊?我用的是自己服务器搭建的。。。现在还在搞 nfs、cifs、afp、sftp 哪个可以直接挂载。。。

自己搭 CDN ……
你要不要试试 Nginx 反代+proxy_store

不会...我今天搞 afp、nfs ? cifs 挂载都快吐了...别的技术我更不会了...

信我,Linux 下配 FTP 绝对比配反代麻烦
你要用挂载的话可以用 sshfs,但是性能不行
大体上反代缓存只需要三条
location / {
try_files 缓存路径 {
proxy_pass 源站
proxy_store 缓存目录
}
然后 w3 配置成 mirror 就行

我不是很懂技术,这么设置的话,我在 wordpress 发布图片附件时,可以自动导入到 cdn 服务器上吗?

图片可以放在 cos oss upyun qiniu

这样的话就和又拍,七牛之类的 pull 模式差不多意思了。当然商业产品要复杂得多。
图片发布时是在源服的。缓存服务器如果 miss 就会回源然后保存,之后的访问就不会再回源了。

有过一次放在某个 cdn 云服务器上,结果服务器坏了,整个图片都掉了,所以很是阴影。

好吧。。。看来还是要好好研究研究

商业服务挂了这不是理由。自建怎么就能比商业服务可靠性更高?你要投入多少精力维护?
CDN 你可以选那些可以绑 cname 的,绑个子域名上去,然后用 w3 选 mirror 模式

301 这个问题我已经通过 w3 这个插件继续了。但现在就是遇到附件上传如何能自从远程附件到我搭建的 cdn server 里,不要 ftp 和 ftps。。。但 w3 不支持 sftp,不知道有什么推荐吗? sftp 插件。。。rsync、nfs、cifs、afp 等等同步。。。我这几个同步因为在 mac 上,所以都失败了。。。T_T

你没懂我意思
反代第一个请求自动回源不就好了,反正只回源一次,不要吊死在 push 这棵树上,pull 也可以啊

怎么会,你这种情况只能在 php 里面处理,取出所有 url,根据需求将需要的 url 在输出的时候替换即可,!

https://jalena.bcsytv.com/archives/1445 这里你可以去看看!

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服