查看网站在切换域名后是否正常
如果网站域名变了,原来的页面还能正常展现交互吗?
1. 需求场景
需求是这样子的:公司有另外一个域名pps.tv,和自身的域名iqiyi.com完全不同。现在想让网站pps.tv用网站iqiyi.com的前端代码(页面/JS/CSS/Flash/图片等),但是仍然让用户用pps.tv域名访问。需要确认iqiyi.com的前端代码在新域名pps.tv下的展现是否正常,交互是否OK。
要准备测试方案。
2. 解决方案
最简单的方法是, 抓线上iqiyi.com的页面到本地,然后用本地文件/目录映射工具(如fiddler auto responder)或本地搭web server+配pps.tv域名到127.0.0.1的host,然后打开浏览器访问pps.tv。
这样能查看单个页面的情况,但是需要先抓页面到web server的DocumentRoot目录。
能不能不抓页面到本地呢? 可以,用反向代理!代理在收到浏览器发来的pps.tv下的http请求时,直接rewrite成iqiyi.com下的url,然后代理发起一个对rewrite之后的url的http请求,获得iqiyi.com服务器响应之后,再转交给浏览器。如下nginx配置:
server { listen 80; server_name xxx.pps.tv; location / { proxy_pass http://www.iqiyi.com; proxy_set_header Host www.iqiyi.com; } }
以上就能满足浏览器地址栏中输入pps.tv网址,自动去拿iqiyi.com对应的页面来显示的需求了。
现在要更进一步:点击页面上的链接(仍然是iqiyi.com的,尽管地址栏已经变成pps.tv了),能不能让新打开的页面的地址栏仍然是pps.tv?
这个需求可以分两步:
第一步:nginx在收到浏览器发来的iqiyi.com的请求时,自动给返回个301/302响应,让浏览器跳到pps.tv的地址;
第二步:像刚才那样,收到浏览器发的pps.tv的请求后,nginx rewrite成iqiyi.com的url,发请求到iqiyi.com的web server获得响应,然后转发给浏览器。
现在nginx既要能拦截到浏览器发过来的iqiyi.com的请求,也要能拦截到pps.tv的请求。这个情况要么把iqiyi.com和pps.tv的host都设置到nginx的host,要么把浏览器的代理设置到nginx。采用代理的方式。
http { #下面是对www.iqiyi.com服务器的反向代理的配置 upstream www_iqiyi_com { server 202.108.14.98:80; #nslookup 下www.iqiyi.com的线上服务器地址 } server { listen 80; server_name xxx.pps.tv; location / { proxy_pass http://www_iqiyi_com; proxy_set_header Host www.iqiyi.com; } } #下面是正向代理的配置 server { #正向代理需要配置dns服务器 resolver 8.8.8.8; resolver_timeout 5s; listen 8989; location / { if ( $host ~* 'www.iqiyi.com' ){ #这里生成301跳转,Location的host替换成xxx.pps.tv rewrite ^(.*) $scheme://xxx.pps.tv$request_uri permanent; } if ( $host ~* 'xxx.pps.tv' ){ #这里正向代理服务器 把xxx.pps.tv域的请求 转给了 反向代理服务器 proxy_pass http://127.0.0.1:80; } if ( $host !~* 'xxx.pps.tv' ){ proxy_pass $scheme://$host$request_uri; } proxy_set_header Host $http_host; proxy_buffers 256 8k; proxy_max_temp_file_size 0; proxy_connect_timeout 30; proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; } } }
nginx使用上面的配置之后,只要把浏览器的代理设置到127.0.0.1:8989,不需要配置xxx.pps.tv和www.iqiyi.com的host,就能用xxx.pps.tv访问www.iqiyi.com的网站内容。有图有真相:
以上配置相当于把nginx同时当做正向代理和反向代理,来实现用新的域名xxx.pps.tv访问www.iqiyi.com的内容。
插播一句:正向代理与反向代理区别:
正向代理,代替浏览器发请求,把真正发送request的客户端给隐藏了,需要在代理服务器和浏览器之间进行配置,对http服务器器是透明的;
反向代理,代替服务器回响应,把真正提供response的服务器给隐藏了,需要代理服务器和http服务器之间进行配置,对浏览器是透明的。
上面的nginx同时开启正向代理和反向代理服务,相当于同时“欺骗”了http服务器和浏览器。
3. 域名切换导致的问题
回到最初的问题,使用新域名,页面能正常展现,但是一些交互出现问题:JS/Cookie/iframe/flash的跨域导致浏览器报错。下图就是登出功能(使用iframe实现)故障的例子:
另外图片服务器也检查了request的referer头进行防盗链处理,还好qiyipic.com服务器允许xxx.pps.tv页面的DOM图片请求。
blog comments powered by Disqus