现在,我正在使用以下nginx
configuration将app的域名从app.example.com
到app.newexample.com
:
server { server_name app.example.com; location /app/ { rewrite ^/app/(.*)$ http://app.newexample.com/$1; } }
我需要显示一个popup式标语来通知用户域名迁移。 而且我想根据referrer
或app.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会将引用者设置为旧页面。 如果引荐来源不以旧网页网址开头,则不是由该网页引导的。 也许有点快肮脏,但应该工作。