请教一个 nginx 301 只添砖网站下特定目录的一个问题。。。wordpress 程序。。。

2017-05-19 17:02:44 +08:00
 imrei
我有个网站 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 后,我访问首页还是没有不变化。。。请问该怎么做呢?



求高人指点。。。
3388 次点击
所在节点    NGINX
28 条回复
honk
2017-05-19 18:07:53 +08:00
用插件吧,比如 w3-total-cache,有相关设置
ryd994
2017-05-19 18:09:26 +08:00
因为这个 rewrite 是内部 rewrite 啊
建议使用 wp 的相关插件,会自动替换输出
或者使用 sub_filter 和 subs_filter 不过有各种麻烦,没经验还是上插件吧
hl
2017-05-19 18:12:38 +08:00
$host = "www.a.com/wp-content/uploads/"
这个条件不对,$host 只包含访问过来的域名,不带路径,所以这个条件永远不会被匹配上
imrei
2017-05-19 22:13:04 +08:00
@honk w3 必须要开启 ftp 才可以,我之前就是开了 ftp,但现在 ftp 有点纠结不能用了,所以需要换掉。。。
@ryd994 有合适的插件吗?一只木有找到


@hl 我根据你的改了,但还是不行,麻烦能看看还需要哪里改吗 T_T

location ~* ^www.a.com {
rewrite ^/wp-content/uploads/(.*)$ https://cdn.s.com/wp-content/uploads/$1 permanent;
}
ryd994
2017-05-19 22:30:41 +08:00
@imrei 反正我 w3 没开过 FTP 用的好好的,lnmp
imrei
2017-05-19 22:55:58 +08:00
@ryd994 不开 ftp 怎么设置二级域名呢?
hl
2017-05-19 22:56:06 +08:00
@imrei 不是不是,有些混乱,我跟你细说一些

做重定向,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
hl
2017-05-19 22:59:21 +08:00
@imrei
还有啊,我把你的配置上,直接测试,也是可以的啊
比如这个:
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 的啊
tSQghkfhTtQt9mtd
2017-05-19 23:43:03 +08:00
直接上插件 CDN Enabler,你这方案太不优雅了。。。哪有 301 到 CDN 的。。。
ryd994
2017-05-19 23:46:37 +08:00
@hl 牛头不对马嘴,你这还是 CDN 么?自己一个 301
@imrei 凭什么设置二级域名要 FTP。服务器配置文件直接写就好了,这年头还有谁用 FTP 的?你可能是 Web 目录没开写权限,暂时开一下,设置完了再关
hl
2017-05-20 03:03:57 +08:00
@ryd994 没理解和 cdn 啥关系? 楼主不就是要一个跳转么?
jalena
2017-05-20 03:25:08 +08:00
```// 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');
}```
yansyuei
2017-05-20 10:58:53 +08:00
js css 还可以弄 static 你这弄啥 cdn 啊 你这方案太不优雅了+1
imrei
2017-05-20 12:16:16 +08:00
@jalena @hl 谢谢两位,但我这里居然都失败 T_T

@liwanglin12 @yansyuei 国内云主机带框太贵,才 1m,我又一个地方是双线联通+电信,各 20m 的,所以想吧图片都放过去。。。CDN Enabler 试过了,无效。。。不知道要不要修改哪里。。。

@ryd994 谢谢,w3 的插件我把 ftp 信息去掉了,第一次知道原来可以这样用 T_T 不过想请教下,我是因为有双线 20m 带宽的机器,想把 uploads 目录放到那个机器上。但现在还有个问题,我在 wordpress 上传图片后,如果不是通过 w3 的 ftp 远程附件,还有什么办法可以把这些图片导入到远程 cdn 服务器上的 uploads 目录吗? 我试过 rsync,但只能设定时间扫描文件是否有修改再上传。。。由于我图片较多,我设置 3 秒扫描一次,又怕这样服务器会死很惨 T_T
ryd994
2017-05-20 13:02:38 +08:00
@imrei 看你用的哪家了,很多 CDN 是有镜像 /pull 模式的,设置一个专用的二级域名,对方会给你反代并缓存
其他的一般有上传接口,可以在 w3 里配置自动上传,具体情况具体讨论
imrei
2017-05-20 15:04:26 +08:00
@ryd994 你用的专有 cdn 啊?我用的是自己服务器搭建的。。。现在还在搞 nfs、cifs、afp、sftp 哪个可以直接挂载。。。
ryd994
2017-05-20 18:25:25 +08:00
@imrei 自己搭 CDN ……
你要不要试试 Nginx 反代+proxy_store
imrei
2017-05-20 18:34:48 +08:00
@ryd994 不会...我今天搞 afp、nfs ? cifs 挂载都快吐了...别的技术我更不会了...
ryd994
2017-05-20 18:45:07 +08:00
@imrei 信我,Linux 下配 FTP 绝对比配反代麻烦
你要用挂载的话可以用 sshfs,但是性能不行
大体上反代缓存只需要三条
location / {
try_files 缓存路径 @fetch
}
location @fetch {
proxy_pass 源站
proxy_store 缓存目录
}
然后 w3 配置成 mirror 就行
imrei
2017-05-20 18:54:51 +08:00
@ryd994 我不是很懂技术,这么设置的话,我在 wordpress 发布图片附件时,可以自动导入到 cdn 服务器上吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/362493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX