我有一个仅对 example.com 有效的 SSL 证书(对子域名无效),因此想重定向两者http://example.com和http://www.example.com到https://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
一致更改。