目前,我正在使用以下app.example.com
配置将我的应用的域名从app.newexample.com
迁移到nginx
:
server {
server_name app.example.com;
location /app/ {
rewrite ^/app/(.*)$ http://app.newexample.com/$1;
}
}
我需要显示一个popup-banner来通知用户域名迁移。
我希望这基于referrer
或app.newexample.com
但是如何在上面的rewrite
附加一个额外的标题,以便javascript检测到该标题并仅在该标题出现时显示标题,因为用户直接在app.newexample.com
处不应该看到那个popup-banner?
答案 0 :(得分:5)
问题是,当你“重写”到具有协议和主机名的URI(在你的情况下是http://app.newexample.com/
)时,Nginx会发布公平的HTTP重定向(我猜代码将是301又称“永久重定向” )。这使您只有两种机制将任何信息传输到新URL的处理程序:
由于您要将用户重定向到新域,因此cookie无法使用。但即使在普通域名的情况下,我也会选择URL来传输此类信息,例如
server_name app.example.com;
location /app/ {
rewrite ^/app/(.*)$ http://app.newexample.com/$1?from_old=yes;
}
这使您可以自由地在Nginx或浏览器中处理(使用JavaScript)。您甚至可以在新应用服务器Nginx配置中为JavaScript发出特殊的HTTP标头:
server_name app.newexample.com;
location /app {
if ($arg_from_old) {
add_header X-From-Old-Site yes;
}
}
答案 1 :(得分:1)
讨论了类似的问题here。您可以尝试使用第三方模块HttpHeadersMore(我自己也没试过)。但即使它根本不起作用,在this模块的帮助下,你也可以完成所有事情。示例是here。
答案 2 :(得分:1)
您的重定向缺少一件事,重定向类型/代码,您应该在重写行的末尾添加permanent
,如果没有明确提及,我不确定默认的重定向代码是什么。
rewrite ^/app/(.*)$ http://app.newexample.com/$1 permanent;
更好的方法是使用return
location /app {
return 301 $scheme://app.newexample.com$request_uri;
}
如上所述添加get参数也是一种可行的方法,您可以轻松设置会话(flash)并再次重定向到自己的页面,但是在删除附加的get参数后。
编辑: 重定向不会发送引用标头,如果旧域仍在工作,您可以放置一个简单的php文件,通过标头调用进行重定向。
header("Location: http://app.newexample.com")
答案 3 :(得分:1)
没有任何标题的一种可能的解决方案是检查document.referrer属性:
if (document.referrer.indexOf("http://app.example.com") === 0) {
alert("We moved!");
}
使用301会将引荐来源设置为旧页面。如果引荐来源不是以旧页面网址开头,则该网页不会引导该网页。也许有点快肮脏,但应该工作。