fastcgi_mono_server 4通配符主机名

时间:2016-01-14 13:28:06

标签: nginx mono

我已经使用fastcgi_mono_server4配置了nginx。 在我的nginx配置中,我有2个主机名:

server {
    listen       80;
    server_name  dev.example.org
    location / {
             root /var/www/dev.example.org/;
             fastcgi_index Default.aspx;
             fastcgi_pass 127.0.0.1:9001;
             include /etc/nginx/fastcgi_params;
        }
}

 server {
        listen       80;
        server_name  *.example.org
        location / {
             root /var/www/example.org/;
             fastcgi_index Default.aspx;
             fastcgi_pass 127.0.0.1:9000;
             include /etc/nginx/fastcgi_params;
        }
    }

nginx可以使用此配置。 dev去了一个,另一个到另一个。

我已经尝试过了:

fastcgi-mono-server4 /applications=*.example.org:/:/var/www/example.org/ /socket=tcp:127.0.0.1:9000

但它会抛出错误(Uri解析异常)

更新 我需要在我的应用程序中获取完整的主机名,例如,如果请求是abc.example.org,我需要获得“abc”。 不幸的是,HttpContext.Current.Request.Url不包含“abc”而是“*”导致解析错误

2 个答案:

答案 0 :(得分:1)

如果nginx将负责将相应的子域路由到每个fastcgi端口(9000或9001),那么当您启动单声道服务器进程时,您可以使用通配符域。只需使用*而不是'* .example.org'

fastcgi-mono-server4 /applications=*:/:/var/www/example.org/ /socket=tcp:127.0.0.1:9000

更新:上述方法可以让两个Mono服务器应用程序通过nginx进行监听,但是,如果您在原始问题上调用HttpContext.Request.Url,则使用原始问题中的nginx配置会导致异常全能服务器。这是因为它不喜欢*中的*.example.org

有两种可能的解决方案,具体取决于您希望在客户浏览HttpContext.Request.Urlfoo.example.org等时从bar.example.org返回的内容。

选项1:如果您不关心子域并希望看到example.org

将第二个(*.example.org)nginx服务器配置为'default_server',并让它分配不带通配符的服务器名称,例如。

server {
  listen 80 default_server;
  server_name example.org;
  access_log ... } 

使用这些设置,浏览到foo.example.org/Default.aspx会加载页面,HttpContext.Request.Url会返回example.org/Default.aspx

选项2:如果您想查看实际的子域,例如foo.example.org

从第二个服务器定义中删除server_name。

server {
  listen 80 default_server;
  access_log ... }

使用这些设置,浏览到foo.example.org/Default.aspx会加载页面,HttpContext.Request.Url会返回foo.example.org/Default.aspx

答案 1 :(得分:0)

@ stephen的答案更简单,不需要fastcgi配置修改。

我尝试了之前的回答(更新前),但它没有用。 正如@stephen所说,Nginx负责路由,并且路由部分工作正常。

启动fastcgi我使用此命令匹配所有路由(和服务器名称)

fastcgi-mono-server4 /applications=/:/var/www/example.org/ /socket=tcp:127.0.0.1:9000

问题是HttpContext.Request.Url在我的情况下包含$ server_name值,它是“* .example.org”,当我尝试解析URI时出现错误。

为了解决这个问题,我改变了nginx fastcgi_params并取代了这行

fastcgi_param  SERVER_NAME        $server_name;

通过

fastcgi_param  SERVER_NAME        $http_host;

并添加site-available conf

proxy_set_header Host $host;

我认为它是默认设置的。

重新加载nginx

nginx -t && service nginx reload

重新加载fastcgi-mono-server进行测试

 fastcgi-mono-server4 /applications=/://var/www/example.org/ /socket=tcp:127.0.0.1:9000 /printlog=True /loglevels=Debug
日志SERVER_NAME中的

包含真实(非*)子域。