我正在运行 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 wiki,server_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;
}
希望这能有所帮助。