这是我的情况:
两个站点:
https://example.com
http://dev.example.com
站点 1 有 SSL 证书。
站点 2 没有。
(换句话说,我没有通配符 SSL 证书。)
通过 Nginx,我正在尝试建立必要的www
重定向HTTP
。
站点 1 的目标是指导
example.com
,www.example.com
和https://www.example.com
...到
https://example.com
站点 2 的目标就是简单地让它http://dev.example.com
直接指向自身。
我为实现目标 1 所做出的努力
# SSL Redirect
server {
listen 80;
server_name example.com;
return 301 https://filethemes.com$request.com;
}
# WWW Redirect
server {
listen 80;
listen 443 ssl;
server_name www.example.com
ssl_certificate <my-path-here>.crt;
ssl_certificate_key <my-path-here>.key;
return 301 https://example.com$request_uri
}
# Site's Primary Server Block
server {
listen 443 ssl;
root /var/www/example.com;
index index.html;
server_name example.com;
ssl_certificate <my-path-here>.crt;
ssl_certificate_key <my-path-here>.key;
}
使用上述代码,example.com
转到'https://example.com' 但就是这样。www 重定向不起作用。有什么想法吗?
此外,使用站点 2(子域)的简单服务器块,dev.example.com
它会重定向到https://example.com
。因此,似乎我无意中将子域重定向到主域。有什么想法吗?
我知道已经存在大量有关 Nginx 的问题和答案,但我找不到任何可以帮助我让事情按预期运行的解决方案。
对于这样一个看似简单的目标,其挑战性令人惊讶。
我很感激大家能提供的见解。
PS:是的,我的ssl证书支持www和非www。
更新:
子域名问题(上面的站点 2)不再是问题...我无法将相应的文件从可用的站点重新链接到已启用的站点。
仍然有同样的问题,站点 1 无法从 重定向www
- naked、withhttp
和 with https
。
解决了(!)
问题是什么?没有 DNS CNAME 条目(捂脸!)。非常感谢 @BE77Y 帮助我找到问题所在。此外,为了帮助其他人,以下是我当前完全正常工作的 nginx 配置,由两个服务器块组成,其中一个负责所有重定向到非 www 和 https(并使用 NGINX 最佳实践,即不重写和不使用 if 语句):
# MAIN SERVER BLOCK
server {
listen 443 ssl;
root /var/www/example.com;
index index.html;
server_name example.com;
ssl_certificate <my-path-here>.crt;
ssl_certificate_key <my-path-here>.key;
}
# REDIRECTS (send everything to non-www https)
server {
listen 80;
listen 443;
server_name www.example.com example.com;
ssl_certificate <my-path-here>.crt;
ssl_certificate_key <my-path-here>.key;
return 301 https://example.com$request_uri;
}
陷阱(对于那些不经常使用服务器的人来说):
- 在测试之间清除缓存(或打开和关闭隐身窗口)
- 确保您有一个 CNAME DNS 条目 (www example.com.)!
答案1
从我所见,您几乎已经完成了;我只需要稍微改变配置(根据您所描述的要求),以简化一些事情。有一件事我想澄清一下,那就是您的配置中似乎没有包含 dev.example.com 段?
无论如何,以下是我改进您当前配置的方法:
# Primary block including SSL redirect
server {
listen 80;
listen 443 ssl;
server_name example.com;
root /var/www/example.com;
index index.html;
ssl_certificate <my-path-here>.crt;
ssl_certificate_key <my-path-here>.key;
if ( $scheme = http ){
rewrite ^ https://$server_name$request_uri? permanent;
}
}
# WWW Redirect
server {
listen 80;
listen 443 ssl;
server_name www.example.com
ssl_certificate <my-path-here>.crt;
ssl_certificate_key <my-path-here>.key;
rewrite ^ https://example.com$request_uri? permanent;
}
为了澄清上述内容:这是一种“更干净”的做事方式;如果有人在 请求您的网站,他们将通过声明http://example.com
重定向到,同样,如果他们通过 https 请求,他们将正确地获得该网站的服务(这将是您之前使用单独声明的问题)。如果他们尝试通过 访问该网站,它将被重定向,或者通过它将正确协商 SSL,但仍然像上面一样重定向。 https://example.com
if
http://www.example.com
https://www.example.com
正如我所指出的,您没有在配置文件中包含任何与 dev.example.com 相关的段 - 我认为这是因为您已经让它们工作了,但如果没有,请随时对此发表评论,我很乐意协助将它们包括在上面的内容中。
希望有帮助!