2

内的文件/etc/nginx/sites已启用具有以下功能

服务器{服务器名称production.domain.club cspiero.domain.colub;root/home/deploy/domain/current/public;[...]ssl_certificate/etc/letsencrypt/live/cspiero.domain.club/fullchain.pem;#由Certbot管理ssl_certificate_key/etc/letsencrypt/live/cspiero.domain.club/privkey.pem;#由Certbot管理[...]服务器{if($host=production.domain.club){返回301 https://$host$request_uri;}听80;听[::]:80;}服务器{if($host=cspiero.domain.club){返回301 https://$host$request_uri;}听80;听[::]:80;}

虽然nginx-t通过,服务器的实际行为是第三级域生产正在按预期呈现,而cspiero公司不是路由到同一位置,而是由默认配置处理(浏览器还接收到http响应,因此忽略证书)

服务器{root/home/deploy/default;索引index.html;服务器名称_;位置/{try_files$uri$uri/=404;}}

为什么会发生这种情况?人们希望为所有其他捕鱼探险请求保持默认配置(呈现出非常轻和平淡的效果)。那么,在这种情况下应该做什么?

2
  • 1
    在站点正常工作之前,不要使用301重定向。你在浏览器中测试过吗?如果是这样,你的结果就毫无意义了。浏览器将无限期缓存301响应。 评论 5月26日21:03
  • 是的,事实上,我在浏览器中测试后发到了这里。缓存的301响应上的指针非常有用。同样高兴的是,当@Richard Smith的答案帮助清除从certbot编辑中继承的旧垃圾时,错误突然出现。
    – 杰罗姆
    评论 5月28日6:40

1答案1

重置为默认值
2

您有三个“默认”服务器块,因为有三个块没有服务器名称或使用假名_。请参阅文档在catch-all服务器上。

因此,出现在端口80上的任何请求都将由第一个服务器块处理。这是所有请求,与域名无关。

有许多使用if($host=模式,但这些大多来自certbot自动生成的编辑,因为很难正确执行。

正确的解决方案是更换如果块,带有服务器名称声明。事实上,你可以把两个组合成一个服务器块。

替换:

服务器{if($host=production.domain.club){返回301 https://$host$request_uri;}听80;听[::]:80;}服务器{if($host=cspiero.domain.club){返回301 https://$host$request_uri;}听80;听[::]:80;}

使用:

服务器{服务器名称production.domain.club cspiero.domain.colub;返回301 https://$host$request_uri;听80;听[::]:80;}
2
  • 另一个肯定的曲线球。。。有趣的是,这种模式在其他地方也存在,但似乎发挥了作用。我将搜索这些以修复语法。
    – 杰罗姆
    评论 5月26日7:42
  • 1
    如果操作正确,该模式将起作用。这个如果块应在单个服务器块,带有服务器名称和最终返回4xx语句来处理以下情况如果块匹配。 评论 5月26日8:09

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.