我目前处于需要获取/捕获子域并将该子域值传递给Nginx配置中的proxy_pass的情况。
e.g。
如果用户输入
http://google.com.mydomain.com
然后它应该代理传递为
proxy_pass http://www.google.com/;
上面示例google.com
中的是sub-domain
这可行吗? 我怎样才能在nginx中实现类似的东西?
目前我正在使用配置,其中子域值在配置文件中是硬编码的,但是有很多子域,所以我需要这样做,但不知道正确的语法。 / p>
server {
listen 80;
server_name subdomain.domain.com;
charset utf-8;
location / {
proxy_pass http://www.subdomain/;
}
}
我使用*作为A记录将所有子域重定向到我的web主机,即通配符DNS。
更新:
我找到了来自https://stackoverflow.com/a/22774520/1642018
的代码段server {
listen 80;
# this matches every subdomain of domain.
server_name .domain.com;
location / {
set $subdomain "";
if ($host ~* "^(.+)\.domain.com$") {
set $subdomain $1;
}
proxy_pass http://$subdomain;
}
}
但请求显示的是我的默认网页根目录中的默认页面。
答案 0 :(得分:2)
两件事。
1-解析器(nginx的dns服务器,以解析google.com,您可以在主机上添加或者您可以添加解析器声明)
2-您需要解决客户处理不同域名的问题,我的意思是google.com与google.com.ar或google.fr不同
在这个例子中,我为你的例子google.com做了工作
worker_processes 4;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
set $subdomain "";
if ($host ~* "^(.+)\.domain.com$") {
set $subdomain $1;
}
resolver 8.8.8.8;
proxy_pass "http://$subdomain.com";
}
}
}
我希望这种配置对您有所帮助。
答案 1 :(得分:1)
如果定义了变量,我会使用map捕获子域,然后代理传递:
map $host $subdomain {
~^(?<sub>.+)\.[^\.]+\.[^\.]+$ $sub;
}
server {
listen 80 default_server;
server_name _;
location / {
if ($subdomain) {
proxy_pass http://$subdomain;
}
}
}