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

求助一个 Nginx 多次重定向的问题

  •  1
     
  •   Linken404 · 363 天前 · 1559 次点击
    这是一个创建于 363 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为某些历史原因,有个网站的对外端口不能改变,但目前必须更换域名和端口。 例如原网站的一个正常访问链接是:

    http://aaa.example.com:8080/test.html?data-src=http://aaa.example.com:8080/test.mp4&data-cover=http://aaa.example.com:8080/test.jpg
    

    其中我想让无论是 url 还是参数中的http://aaa.example.com:8080都变更为https://bbb.example.com,那用户访问上面的链接,最终打开的页面显示的链接应该是:

    https://bbb.example.com/test.html?data-src=https://bbb.example.com/test.mp4&data-cover=https://bbb.example.com/test.jpg
    

    我最开始认为就是个普通的跳转,直接建了一个新的 aaa.example.com:8080 ,里面用 return 301 ,并将之前的 aaa 对应的配置文件改为了 bbb 的。结果发现后面的参数没有变,导致访问异常,视频不能播放。

    请问具体应该怎么做,才可以做到上面所要达到的效果呢?

    10 条回复    2023-12-21 10:32:55 +08:00
    OceanBreeze
        1
    OceanBreeze  
       363 天前
    你不发 nginx 配置让大家怎么帮你?
    yuyuf
        2
    yuyuf  
       363 天前
    变后面的参数,得看具体代码实现,不是配置一下就行了的。
    如果参数的域名服务端下发的,那得服务端改
    如果参数是前端拼接的,那得看前端的是怎么拼接的
    Linken404
        3
    Linken404  
    OP
       363 天前
    @OceanBreeze 配置只有跳转,感觉描述清楚了就没发
    ```
    server {
    listen 8080;
    listen 443 ssl;
    server_name aaa.example.com;

    ssl_certificate /nginx/conf/ssl/example.com.pem;
    ssl_certificate_key /nginx/conf/ssl/example.com.key;

    return 301 http://bbb.example.com$request_uri;

    }

    server {
    listen 8080;
    listen 443 ssl;
    server_name bbb.example.com;
    ssl_certificate /nginx/conf/ssl/example.com.pem;
    ssl_certificate_key /nginx/conf/ssl/example.com.key;

    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' '*';
    add_header 'Access-Control-Allow-Headers' '*';

    rewrite ^(.*)aaa\.example\.com:8080(.*)$ $1bbb.example.com$2 permanent;

    location / {
    root html;
    index index.html index.htm;
    }
    }
    ```
    @shiziqyf 是已经有很多历史的静态页面了,里面链接是写死的,现在域名跟端口需要更新,但要保持大量的旧链接的视频仍然可以打开,才有了这个问题……所以现在面临的问题其实是这些旧链接怎么能保持正常
    yuyuf
        4
    yuyuf  
       363 天前
    如果不能换参数,也就是要实现
    aaa.example.com 能访问资源
    bbb.example.com: 能访问网站
    这个意思吗
    那就原来配置不能动,再加一个 bbb.example.com 的配置,配置内容跟 aaa.example.com 一样
    Kinnice
        5
    Kinnice  
       363 天前
    在 location / { 里面增加
    sub_filter 'aaa.example.com 'bbb.example.com';
    sub_filter_once off;
    rockyliang
        6
    rockyliang  
       363 天前
    @Linken404 #3 ,单纯看配置文件,bbb.example.com 的 http 协议监听端口是 8080 ,你在 return 301 的时候又没有指定 8080 端口,不确定是不是这个原因
    Linken404
        7
    Linken404  
    OP
       363 天前
    @shiziqyf 其实还有个原因没说到,那就是 bbb.example.com 是过 cdn 的,而 aaa.example.com:8080 没办法过 cdn ,为了保持流量带宽正常,需要让指向旧的 aaa.example.com:8080 的这些访问请求也能通过 cdn 代理出来。
    我设想的是:客户端-->aaa:8080-->bbb:443-->cdn 缓存-->真正的源站
    所以单独建一个配置是做不到的


    @Kinnice 这个确实学到了,改动稍微有点大,但确实是个临时能解决问题的好办法,我当最终的备用方案吧


    @rockyliang 那倒不是,我试了一下其实如果不带参数直接访问资源的那些 url 都已经访问成功了,但还有一部分是像示例中那种一个 url 中用参数调用了多个文件,就这种目前我还没办法处理
    Linken404
        8
    Linken404  
    OP
       363 天前
    @shiziqyf 百度的 CDN 便宜,但是不支持自定端口,对外开放的只有 80 跟 443 ,我们这种非标准的 8080 端口过了一遍 cdn 之后就不生效了,别的 CDN 做视频缓存又太贵了,所以只能自己想办法。
    runwu2022
        9
    runwu2022  
       363 天前
    后端服务器上绑定了之前的 aaa.example.com:8888 了吧,代码层面的配置导致响应页面内有原来的域名的相关配置,光 301 跳转无用。你应该参考 5 楼配置,直接用 sub_filter 修改。
    Linken404
        10
    Linken404  
    OP
       363 天前
    @runwu2022 前端页面是纯静态写死的调用链接,后端视频服务器的地址倒可以随便调整和添加,这就是我最开始想的路子。今天尝试了一下确实 sub_filter 是最能直接出效果的,就是网站很多,批量改动稍微有点麻烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4519 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:35 · PVG 13:35 · LAX 21:35 · JFK 00:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.