请教一个 nginx 301 只添砖网站下特定目录的一个问题。。。wordpress 程序。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imrei
V2EX    NGINX

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

  •  
  •   imrei 2017-05-19 17:02:44 +08:00 3898 次点击
    这是一个创建于 3145 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有个网站 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 后,我访问首页还是没有不变化。。。请问该怎么做呢?



    求高人指点。。。
    28 条回复    2017-05-21 11:36:48 +08:00
    honk
        1
    honk  
       2017-05-19 18:07:53 +08:00
    用插件吧,比如 w3-total-cache,有相关设置
    ryd994
        2
    ryd994  
       2017-05-19 18:09:26 +08:00
    因为这个 rewrite 是内部 rewrite 啊
    建议使用 wp 的相关插件,会自动替换输出
    或者使用 sub_filter 和 subs_filter 不过有各种麻烦,没经验还是上插件吧
    hl
        3
    hl  
       2017-05-19 18:12:38 +08:00
    $host = "www.a.com/wp-content/uploads/"
    这个条件不对,$host 只包含访问过来的域名,不带路径,所以这个条件永远不会被匹配上
    imrei
        4
    imrei  
    OP
       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;
    }
        5
    ryd994  
       2017-05-19 22:30:41 +08:00 via Android
    @imrei 反正我 w3 没开过 FTP 用的好好的,lnmp
    imrei
        6
    imrei  
    OP
       2017-05-19 22:55:58 +08:00
    @ryd994 不开 ftp 怎么设置二级域名呢?
    hl
        7
    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
        8
    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
        9
    tSQghkfhTtQt9mtd  
       2017-05-19 23:43:03 +08:00 via Android
    直接上插件 CDN Enabler,你这方案太不优雅了。。。哪有 301 到 CDN 的。。。
    ryd994
        10
    ryd994  
       2017-05-19 23:46:37 +08:00 via Android
    @hl 牛头不对马嘴,你这还是 CDN 么?自己一个 301
    @imrei 凭什么设置二级域名要 FTP。服务器配置文件直接写就好了,这年头还有谁用 FTP 的?你可能是 Web 目录没开写权限,暂时开一下,设置完了再关
    hl
        11
    hl  
       2017-05-20 03:03:57 +08:00
    @ryd994 没理解和 cdn 啥关系? 楼主不就是要一个跳转么?
    jalena
        12
    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');
    }```
    J0022ZjV7055oN64
        13
    J0022ZjV7055oN64  
       2017-05-20 10:58:53 +08:00
    js css 还可以弄 static 你这弄啥 cdn 啊 你这方案太不优雅了+1
    imrei
        14
    imrei  
    OP
       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
        15
    ryd994  
       2017-05-20 13:02:38 +08:00
    @imrei 看你用的哪家了,很多 CDN 是有镜像 /pull 模式的,设置一个专用的二级域名,对方会给你反代并缓存
    其他的一般有上传接口,可以在 w3 里配置自动上传,具体情况具体讨论
    imrei
        16
    imrei  
    OP
       2017-05-20 15:04:26 +08:00
    @ryd994 你用的专有 cdn 啊?我用的是自己服务器搭建的。。。现在还在搞 nfs、cifs、afp、sftp 哪个可以直接挂载。。。
    ryd994
        17
    ryd994  
       2017-05-20 18:25:25 +08:00 via Android
    @imrei 自己搭 CDN ……
    你要不要试试 Nginx 反代+proxy_store
    imrei
        18
    imrei  
    OP
       2017-05-20 18:34:48 +08:00 via iPhone
    @ryd994 不会...我今天搞 afp、nfs ? cifs 挂载都快吐了...别的技术我更不会了...
    ryd994
        19
    ryd994  
       2017-05-20 18:45:07 +08:00 via Android
    @imrei 信我,Linux 下配 FTP 绝对比配反代麻烦
    你要用挂载的话可以用 sshfs,但是性能不行
    大体上反代缓存只需要三条
    location / {
    try_files 缓存路径 @fetch
    }
    location @fetch {
    proxy_pass 源站
    proxy_store 缓存目录
    }
    然后 w3 配置成 mirror 就行
    imrei
        20
    imrei  
    OP
       2017-05-20 18:54:51 +08:00 via iPhone
    @ryd994 我不是很懂技术,这么设置的话,我在 wordpress 发布图片附件时,可以自动导入到 cdn 服务器上吗?
    J0022ZjV7055oN64
        21
    J0022ZjV7055oN64  
       2017-05-20 20:24:49 +08:00
    @imrei #14 图片可以放在 cos oss upyun qiniu
    ryd994
        22
    ryd994  
       2017-05-20 21:22:32 +08:00 via Android
    @imrei 这样的话就和又拍,七牛之类的 pull 模式差不多意思了。当然商业产品要复杂得多。
    图片发布时是在源服的。缓存服务器如果 miss 就会回源然后保存,之后的访问就不会再回源了。
    imrei
        23
    imrei  
    OP
       2017-05-20 21:33:50 +08:00
    @yansyuei 有过一次放在某个 cdn 云服务器上,结果服务器坏了,整个图片都掉了,所以很是阴影。


    @ryd994 好吧。。。看来还是要好好研究研究
    ryd994
        24
    ryd994  
       2017-05-20 21:42:18 +08:00 via Android
    @imrei 商业服务挂了这不是理由。自建怎么就能比商业服务可靠性更高?你要投入多少精力维护?
    CDN 你可以选那些可以绑 cname 的,绑个子域名上去,然后用 w3 选 mirror 模式
    imrei
        25
    imrei  
    OP
       2017-05-20 22:26:08 +08:00
    @ryd994 301 这个问题我已经通过 w3 这个插件继续了。但现在就是遇到附件上传如何能自从远程附件到我搭建的 cdn server 里,不要 ftp 和 ftps。。。但 w3 不支持 sftp,不知道有什么推荐吗? sftp 插件。。。rsync、nfs、cifs、afp 等等同步。。。我这几个同步因为在 mac 上,所以都失败了。。。T_T
    ryd994
        26
    ryd994  
       2017-05-21 02:45:26 +08:00 via Android
    @imrei 你没懂我意思
    反代第一个请求自动回源不就好了,反正只回源一次,不要吊死在 push 这棵树上,pull 也可以啊
    jalena
        27
    jalena  
       2017-05-21 11:35:55 +08:00
    @imrei 怎么会,你这种情况只能在 php 里面处理,取出所有 url,根据需求将需要的 url 在输出的时候替换即可,!
    jalena
        28
    jalena  
       2017-05-21 11:36:48 +08:00
    @imrei https://jalena.bcsytv.com/archives/1445 这里你可以去看看!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5349 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 08:03 PVG 16:03 LAX 00:03 JFK 03:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86