Nginx 服务器块:https、非 www 和非 SSL 子域名

Nginx 服务器块:https、非 www 和非 SSL 子域名

这是我的情况:

两个站点:

  1. https://example.com
  2. http://dev.example.com

站点 1 有 SSL 证书。
站点 2 没有。
(换句话说,我没有通配符 SSL 证书。)

通过 Nginx,我正在尝试建立必要的www重定向HTTP

站点 1 的目标是指导

example.comwww.example.comhttps://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.comifhttp://www.example.comhttps://www.example.com

正如我所指出的,您没有在配置文件中包含任何与 dev.example.com 相关的段 - 我认为这是因为您已经让它们工作了,但如果没有,请随时对此发表评论,我很乐意协助将它们包括在上面的内容中。

希望有帮助!

相关内容