8

现在,我正在将我的应用程序的域从app.example.com使用app.newexample.com以下nginx配置迁移:

server {
    server_name app.example.com;
    location /app/ {
        rewrite ^/app/(.*)$ http://app.newexample.com/$1;
    }
}

我需要显示一个弹出横幅来通知用户域名迁移。我想根据这个referrer或其他一些标题app.newexample.com

但是我怎样才能在上面附加一个额外的标题,rewrite以便 javascript 检测该标题并仅在该标题存在时显示横幅,因为用户直接访问app.newexample.com不应该看到该弹出横幅?

4

4 回答 4

10

The thing is that, when you "rewrite" into URI having protocol and hostname (that is http://app.newexample.com/ in your case), Nginx issues fair HTTP redirect (I guess the code will be 301 aka "permanent redirect"). This leaves you only two mechanisms to transfer any information to the handler of new URL:

  • cookie
  • URL itself

Since you are redirecting users to the new domain, cookie is no-go. But even in the case of a common domain I would choose URL to transfer this kind of information, like

server_name app.example.com;
location /app/ {
    rewrite ^/app/(.*)$ http://app.newexample.com/$1?from_old=yes;
}

This gives you the freedom to process at either Nginx or in a browser (using JavaScript). You may even do what you wanted intially, issuing a special HTTP header for JavaScript in new app server Nginx configuration:

server_name app.newexample.com;
location /app {
  if ($arg_from_old) {
    add_header X-From-Old-Site yes;
  }
}
于 2013-05-15T11:49:16.197 回答
1

没有任何标题的一种可能的解决方案是检查 document.referrer 属性:

if (document.referrer.indexOf("http://app.example.com") === 0) {
   alert("We moved!");
}

使用 301 会将引用者设置为旧页面。如果引荐来源网址不是以旧页面 url 开头,则它不是由该页面定向的。也许有点快 n 脏,但应该工作。

于 2013-05-22T01:04:58.510 回答
1

这里讨论了一个类似的问题。可以尝试使用第三方模块HttpHeadersMore(我自己没试过)。但即使它根本不起作用,在这个模块的帮助下,你绝对可以做任何事情。例子在这里

于 2013-05-15T10:42:02.117 回答
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")
于 2013-05-18T08:19:17.967 回答