在nginx重写中发送额外的标头

时间:2013-05-12 08:47:24

标签: nginx

目前,我正在使用以下app.example.com配置将我的应用的域名从app.newexample.com迁移到nginx

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

我需要显示一个popup-banner来通知用户域名迁移。 我希望这基于referrerapp.newexample.com

上的某种其他标题

但是如何在上面的rewrite附加一个额外的标题,以便javascript检测到该标题并仅在该标题出现时显示标题,因为用户直接在app.newexample.com处不应该看到那个popup-banner?

4 个答案:

答案 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会将引荐来源设置为旧页面。如果引荐来源不是以旧页面网址开头,则该网页不会引导该网页。也许有点快肮脏,但应该工作。