nginx:从 http://*.example.com 重定向到 https://example.com 出现奇怪的行为

nginx:从 http://*.example.com 重定向到 https://example.com 出现奇怪的行为

我有一个仅对 example.com 有效的 SSL 证书(对子域名无效),因此想重定向两者http://example.comhttp://www.example.comhttps://example.com 使用 nginx。我的配置文件开头如下:

server {
        # This should catch all non-HTTPS requests to example.com and *.example.com
        listen 80;
        server_name example.com www.example.com;
        access_log off;
        return 301 https://example.com$request_uri;
}

server {
        listen 443 ssl;
        # Actual server config starts here...

但是,重定向并没有按预期工作。请求http://example.com正确导致https://example.com, 但http://www.example.com将被重定向至https://www.example.com由于我的证书对子域无效,因此会产生 SSL 错误。我知道不可能从无效的 HTTPS 重定向到有效的 HTTPS,但我至少希望实现从 HTTP 到 HTTPS 的重定向,因为用户仍然倾向于在浏览器中输入 www。

当我 时wget --spider www.example.com,它返回正确的结果:

Spider mode enabled. Check if remote file exists.
--2015-03-19 02:22:47--  http://www.example.com/
Resolving www.example.com (www.example.com)... ***.***.***.*** 
Connecting to www.example.com (www.example.com) **** connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://example.com/ [following]
Spider mode enabled. Check if remote file exists.
--2015-03-19 02:22:47--  https://example.com/
...

但由于某种原因,浏览器最终请求https://www.example.com而不是https://example.com。我已经尝试过从多个浏览器和计算机。我的错误在哪里?配置文件中的整个第一个服务器块似乎被完全忽略了 - 如果我删除它,浏览器会显示完全相同的行为(禁用 DNS 缓存),而输出会wget --spider一致更改。

相关内容