在nginx重写中发送额外的头文件

现在,我正在使用以下nginxconfiguration将app的域名从app.example.comapp.newexample.com

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

我需要显示一个popup式标语来通知用户域名迁移。 而且我想根据referrerapp.newexample.com的某种其他头app.newexample.com

但是,如何在上面的rewrite附加一个额外的头文件,以便javascript能够检测到这个头文件,并且只有当这个头文件存在的时候才显示这个横幅文件呢?直接在app.newexample.com的用户不应该看到这个popup横幅文件?

问题是,当你“重写”到具有协议和主机名的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; } } 

这里讨论了类似的问题。 你可以尝试使用第三方模块HttpHeadersMore (我自己没有尝试过)。 但是,即使这个模块不起作用,在这个模块的帮助下,你完全可以做到。 例子就在这里 。

你的重定向缺少一件事,重定向类型/代码,你应该在你的重写行结尾添加permanent ,我不知道什么是默认的重定向代码,如果没有明确提到。

 rewrite ^/app/(.*)$ http://app.newexample.com/$1 permanent; 

更好的方法是使用回报

 location /app { return 301 $scheme://app.newexample.com$request_uri; } 

如上所述添加一个get参数也是一个可靠的方法来做到这一点,你可以轻松地设置一个会话(flash)并重新定向到它自己的页面,但删除附加的get参数后。

编辑:重定向不发送引用标头,如果旧域仍在工作,你可以把一个简单的PHP文件,重定向与标题调用。

 header("Location: http://app.newexample.com") 

没有任何头文件的一个可能的解决方案是检查document.referrer属性:

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

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