Nginx重定向*:端口到子域

时间:2016-11-21 14:31:26

标签: redirect mod-rewrite nginx

我正在使用Nginx,我想知道如何将具有特定端口的所有请求重定向到子域?

这是我的default.conf

server{
        listen 80 default_server;
        server_name localhost;

        location / {
                root /usr/share/nginx/html;
        }
}

server{
        listen 80;
        server_name blog.mydomain.com;

        location / {
                proxy_pass   http://my-ip:8080;
        }
}

因此,我将默认mydomain.com提供给html文件夹,子域blog.mydomain.com提供运行端口8080的应用程序。

我的问题是,当我尝试直接访问my-ip:8080,或mydomain.com:8080blog.mydomain.com:8080服务器为运行端口8080的应用程序提供服务时,我想将所有这些请求重定向到{{1没有blog.mydomain.com

我该怎么做?如果我在网址中指定:8080,则会自动重定向到blog.mydomain.com

2 个答案:

答案 0 :(得分:0)

当您使用my-ip:8080mydomain.com:8080时,您直接调用您的应用程序,而不是nginx。我在这里看到的问题不是"我的webapp没有重定向到nginx"但是"我有一个代理,但我的网络应用程序可以从互联网直接访问"。

一种简洁的解决方法是将您的应用程序隐藏在互联网上,让nginx成为联系它的唯一方式。将您的应用程序配置为侦听localhost(它看起来像是在*0.0.0.0上侦听,这意味着所有接口都是如此。然后,告诉nginx将请求代理到http://localhost:8080;

如果您真的希望保持应用程序在*:8080上侦听,您可以在nginx中添加HTTP标头(例如X-Forwarded-Forproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;)并在应用程序中检测它。没有它,重定向到nginx。请注意,任何人都可以添加HTTP标头...

答案 1 :(得分:0)

您的问题有两种解决方案:

如果您可以更改应用程序代码,那么您可以在应用程序中处理HTTP请求。您应该能够从标题中获取有关端口的信息。

如果您无法更改应用程序代码但可以更改应用程序正在侦听的端口,则可以在nginx中进行重定向。为此,您需要开始侦听nginx中的端口8080并将其重定向到80,并在80端口上将proxy_pass更改为新的应用程序端口。