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

2023-12-20 17:01:22 +08:00
 Linken404

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

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 的。结果发现后面的参数没有变,导致访问异常,视频不能播放。

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

1563 次点击
所在节点    NGINX
10 条回复
OceanBreeze
2023-12-20 17:03:23 +08:00
你不发 nginx 配置让大家怎么帮你?
yuyuf
2023-12-20 17:09:04 +08:00
变后面的参数,得看具体代码实现,不是配置一下就行了的。
如果参数的域名服务端下发的,那得服务端改
如果参数是前端拼接的,那得看前端的是怎么拼接的
Linken404
2023-12-20 17:14:14 +08:00
@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
2023-12-20 17:20:49 +08:00
如果不能换参数,也就是要实现
aaa.example.com 能访问资源
bbb.example.com: 能访问网站
这个意思吗
那就原来配置不能动,再加一个 bbb.example.com 的配置,配置内容跟 aaa.example.com 一样
Kinnice
2023-12-20 18:00:47 +08:00
在 location / { 里面增加
sub_filter 'aaa.example.com 'bbb.example.com';
sub_filter_once off;
rockyliang
2023-12-20 18:06:34 +08:00
@Linken404 #3 ,单纯看配置文件,bbb.example.com 的 http 协议监听端口是 8080 ,你在 return 301 的时候又没有指定 8080 端口,不确定是不是这个原因
Linken404
2023-12-20 18:17:28 +08:00
@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
2023-12-20 18:20:12 +08:00
@shiziqyf 百度的 CDN 便宜,但是不支持自定端口,对外开放的只有 80 跟 443 ,我们这种非标准的 8080 端口过了一遍 cdn 之后就不生效了,别的 CDN 做视频缓存又太贵了,所以只能自己想办法。
runwu2022
2023-12-21 09:58:14 +08:00
后端服务器上绑定了之前的 aaa.example.com:8888 了吧,代码层面的配置导致响应页面内有原来的域名的相关配置,光 301 跳转无用。你应该参考 5 楼配置,直接用 sub_filter 修改。
Linken404
2023-12-21 10:32:55 +08:00
@runwu2022 前端页面是纯静态写死的调用链接,后端视频服务器的地址倒可以随便调整和添加,这就是我最开始想的路子。今天尝试了一下确实 sub_filter 是最能直接出效果的,就是网站很多,批量改动稍微有点麻烦

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

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

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

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

© 2021 V2EX