我正在使用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:8080
或blog.mydomain.com:8080
服务器为运行端口8080的应用程序提供服务时,我想将所有这些请求重定向到{{1没有blog.mydomain.com
。
我该怎么做?如果我在网址中指定:8080
,则会自动重定向到blog.mydomain.com
答案 0 :(得分:0)
当您使用my-ip:8080
或mydomain.com:8080
时,您直接调用您的应用程序,而不是nginx。我在这里看到的问题不是"我的webapp没有重定向到nginx"但是"我有一个代理,但我的网络应用程序可以从互联网直接访问"。
一种简洁的解决方法是将您的应用程序隐藏在互联网上,让nginx成为联系它的唯一方式。将您的应用程序配置为侦听localhost
(它看起来像是在*
或0.0.0.0
上侦听,这意味着所有接口都是如此。然后,告诉nginx将请求代理到http://localhost:8080;
。
如果您真的希望保持应用程序在*:8080
上侦听,您可以在nginx中添加HTTP标头(例如X-Forwarded-For
和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
)并在应用程序中检测它。没有它,重定向到nginx。请注意,任何人都可以添加HTTP标头...
答案 1 :(得分:0)
您的问题有两种解决方案:
如果您可以更改应用程序代码,那么您可以在应用程序中处理HTTP请求。您应该能够从标题中获取有关端口的信息。
如果您无法更改应用程序代码但可以更改应用程序正在侦听的端口,则可以在nginx中进行重定向。为此,您需要开始侦听nginx中的端口8080并将其重定向到80,并在80端口上将proxy_pass
更改为新的应用程序端口。