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

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

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

1334 次点击
所在节点    NGINX
10 条回复
OceanBreeze
141 天前
你不发 nginx 配置让大家怎么帮你?
yuyuf
141 天前
变后面的参数,得看具体代码实现,不是配置一下就行了的。
如果参数的域名服务端下发的,那得服务端改
如果参数是前端拼接的,那得看前端的是怎么拼接的
Linken404
141 天前
@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
141 天前
如果不能换参数,也就是要实现
aaa.example.com 能访问资源
bbb.example.com: 能访问网站
这个意思吗
那就原来配置不能动,再加一个 bbb.example.com 的配置,配置内容跟 aaa.example.com 一样
Kinnice
141 天前
在 location / { 里面增加
sub_filter 'aaa.example.com 'bbb.example.com';
sub_filter_once off;
rockyliang
141 天前
@Linken404 #3 ,单纯看配置文件,bbb.example.com 的 http 协议监听端口是 8080 ,你在 return 301 的时候又没有指定 8080 端口,不确定是不是这个原因
Linken404
141 天前
@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
141 天前
@shiziqyf 百度的 CDN 便宜,但是不支持自定端口,对外开放的只有 80 跟 443 ,我们这种非标准的 8080 端口过了一遍 cdn 之后就不生效了,别的 CDN 做视频缓存又太贵了,所以只能自己想办法。
runwu2022
140 天前
后端服务器上绑定了之前的 aaa.example.com:8888 了吧,代码层面的配置导致响应页面内有原来的域名的相关配置,光 301 跳转无用。你应该参考 5 楼配置,直接用 sub_filter 修改。
Linken404
140 天前
@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