V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
imrei
V2EX  ›  NGINX

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

  •  
  •   imrei · 2017-05-19 17:02:44 +08:00 · 3375 次点击
    这是一个创建于 2534 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有个网站 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;
    }
    ryd994
        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');
    }```
    yansyuei
        13
    yansyuei  
       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 服务器上吗?
    yansyuei
        21
    yansyuei  
       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   ·   我们的愿景   ·   实用小工具   ·   975 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:57 · PVG 03:57 · LAX 12:57 · JFK 15:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.