问题

问题

我正在运行 nginx 版本 1.1.19,并且我已配置服务器指令,根据是否有人使用主机名 domain.com 访问我的服务器(我显示主页)或者他们是否使用其他任何内容访问我的服务器(我显示“没有直接匹配,但您仍然可以获得这个漂亮的页面”页面)来提供不同的页面。

文件A

server {
       listen 80;
       server_name domain.com;
       root /home/ubuntu/http_resources/apex/public;

       location / {
           index index.html;       
       }

文件B

server {

       listen 80;
       server_name "";          #Should catch everything else.

       root /home/ubuntu/http_resources/otherwise/public;

       location / {
            index index.html;       
       }

这两个服务器块配置位于两个单独的文件中,并符号链接到 sites-enabled。它按我预期的方式工作。

  • domain.com -> 显示主网页
  • dummy.domain.com -> 显示“无直接匹配...”页面
  • www.domain.com -> 显示“没有直接匹配...”页面

问题

我想将 www.domain.com 重定向到 domain.com,但其他所有子域名仍会显示“无直接匹配...”页面。我创建了一个文件,其中包含

文件C:

server {
       listen 80;
       server_name www.domain.com;
       rewrite ^ http://domain.com$request_uri? permanent;
}

并将文件符号链接到 sites-enabled,认为这将与 www.domain.com 匹配,并阻止 www.domain.com 进入文件 B 中的服务器块的 Web 根目录。

这似乎开始将 anything.domain.com 重定向到 domain.com 几分钟,而 domain.com 似乎仍在运行。(可能是由于缓存或其他原因)。几分钟后!我的 Amazon 负载均衡器显示 domain.com/index.html 在应用程序服务器上不再处于活动状态(详细信息:负载均衡器检查裸域 domain.com 中的 index.html 以确定流量是否应流向服务器;此外,负载均衡器后面只有一个应用程序服务器)。然后,由于 domin.com 似乎不可用,负载均衡器停止路由到服务器,因此当然没有 domain.com 相关的 URL 在我的浏览器中起作用,因为负载均衡器没有指向任何东西。

我确实尝试运行'wget public_ip_of_server_behind_balancer/index.html,然后我得到了一个 index.html 文件,它基本上说

Site Closed Down
This site has been closed by the service provider.

删除指向文件 C 的符号链接并重新启动 nginx 会导致负载均衡器重新连接到应用程序服务器,并且所有操作均按最初描述的方式运行。我到底做错了什么?

答案1

我没有使用过 Amazon 负载均衡器。因此,我的回答是不会解决您提到的问题,但希望能帮助您缩小问题范围。

对于文件B,根据server_name 上的 Nginx wikiserver_name ""意味着此服务器块将捕获没有“Host”标头的请求。因此,我建议在 listen 指令中使用,default_server如下所示(如上所述这里)...

http {
  index index.html;

  server {
    listen 80 default_server;
    server_name _; # This is just an invalid value which will never trigger on a real hostname.
    access_log logs/default.access.log main;

    server_name_in_redirect off;

    root  /var/www/default/htdocs;
  }
}

对于 fileC,由于您正在执行永久重定向,我建议返回指令,而不是return regex replacement permanent;指令,我也会删除?URL 末尾的,就像这样......

server {
       listen 80;
       server_name www.domain.com;
       return 301 $scheme://domain.com$request_uri;
}

希望这能有所帮助。

相关内容