Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ubuntu 16.04上使用ssl从www重定向到非www在Nginx中不工作_Ssl_Nginx_Redirect - Fatal编程技术网

在Ubuntu 16.04上使用ssl从www重定向到非www在Nginx中不工作

在Ubuntu 16.04上使用ssl从www重定向到非www在Nginx中不工作,ssl,nginx,redirect,Ssl,Nginx,Redirect,我在DigitalOcean Ubuntu16.04微滴上有一个Meteor 1.6站点,使用Phusion Passenger和Nginx部署 我已经在我的服务器上设置了ssl 重定向到,站点工作正常 但是重定向到,显示的只是默认的Nginx页面“欢迎使用Nginx!” 我已经学习了教程并尝试了其他论坛帖子中的内容,但我找不到我的设置有什么问题 来自DigitalOcean控制面板的DNS记录: A www.mysite.org directs to xxx.xx.xx.xx 3600 A

我在DigitalOcean Ubuntu16.04微滴上有一个Meteor 1.6站点,使用Phusion Passenger和Nginx部署

我已经在我的服务器上设置了ssl

重定向到,站点工作正常

但是重定向到,显示的只是默认的Nginx页面“欢迎使用Nginx!”

我已经学习了教程并尝试了其他论坛帖子中的内容,但我找不到我的设置有什么问题

来自DigitalOcean控制面板的DNS记录:

A   www.mysite.org directs to xxx.xx.xx.xx 3600
A   mysite.org directs to xxx.xx.xx.xx 1800
然后,我根据本教程使用Certbot和LetsEncrypt配置了ssl:

我还添加了一个服务器块,通过以下教程将www重定向到普通域:

这是我的nginx配置:

sudo nano/etc/nginx/sites enabled/mysite.conf

server {
    server_name mysite.org www.mysite.org;

    ...Meteor app config

    # added by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysite.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/mysite.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

# added by me
server {
    server_name www.mysite.org;
    return 301 $scheme://mysite.org$request_uri;
}

# added by Certbot
server {
    if ($host = mysite.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name mysite.org;
    return 404; # managed by Certbot
}
我尝试将其添加到我的服务器重定向块,但没有任何区别:

listen 80;
listen 443 ssl;
有没有办法让www.mysite->mysite重定向工作?谢谢大家!

更新:我在另一个应用程序上尝试了flaixman的答案,在另一个droplet上尝试了Django应用程序,结果成功了。但我仍然无法重定向到我的Meteor应用程序。两个站点都以相同的方式配置了A和CNAME记录

以下是我根据弗莱克斯曼的回答所做的流星配置:

server {
    listen 80;
    server_name example.org www.example.org;
    return 301 https://example.org$request_uri;
}

server {
    listen 443 ssl http2; #https of www*, 301 to right domain.
    server_name www.example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    return 301 https://example.org$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/example/bundle/public;

    # Turn on Passenger
    passenger_enabled on;
    # Tell Passenger that your app is a Meteor app

    passenger_app_type node;
    passenger_startup_file main.js;

    # Tell your app where MongoDB is
    passenger_env_var MONGO_URL mongodb://localhost:27017/example;
    passenger_env_var MONGO_OPLOG_URL mongodb://localhost:27017/local;

    # Tell your app what its root URL is
    passenger_env_var ROOT_URL http://example.org;
}
在我的nginx错误日志/var/log/nginx/error.log中,我看到以下消息:

2019/01/17 17:30:52 [warn] 7786#7786: conflicting server name "www.example.org" on 0.0.0.0:80, ignored
2019/01/17 17:30:52 [warn] 7786#7786: conflicting server name "www.example.org" on 0.0.0.0:443, ignored
2019/01/17 17:30:52 [warn] 7789#7789: conflicting server name "www.example.org" on 0.0.0.0:80, ignored
2019/01/17 17:30:52 [warn] 7789#7789: conflicting server name "www.example.org" on 0.0.0.0:443, ignored
我希望这意味着我的conf文件中有一个重复的listen指令,但我看不到任何指令?我已经用ls-a检查过了,文件夹中没有conf文件的第二个副本

这个错误可能与重定向失败有关,但我看不出是什么导致了这个错误

再次编辑:我终于在/etc/nginx/sites available/default中找到了重复的listen指令。不确定Certbot是否插入了它们,或者我自己在设置服务器时是否将它们放在了那里……无论如何,注释它们似乎已经解决了问题。可能是Phusion乘客说明中关于设置服务器块的内容与LetsEncrypt说明冲突?总之,nginx错误日志很好

检查您的DNS设置。 您必须具有CNAME或条目“www”

此外,还需要在块中添加listen参数

listen 443 ssl http2;
编辑:基于评论

将其添加到配置文件的顶部

server {
  server_name mysite.org www.mysite.org;
  if ($server_name ~* \.mysite.org$) {
    return 301 $scheme://mysite.org$request_uri;
  }
  ...Meteor app config    
}
检查您的DNS设置。 您必须具有CNAME或条目“www”

此外,还需要在块中添加listen参数

listen 443 ssl http2;
编辑:基于评论

将其添加到配置文件的顶部

server {
  server_name mysite.org www.mysite.org;
  if ($server_name ~* \.mysite.org$) {
    return 301 $scheme://mysite.org$request_uri;
  }
  ...Meteor app config    
}

Stackoverflow告诉我mysite不是一个合适的域来用作示例,所以我将所有内容都改为“示例”,而不是“mysite”

我想你想要的是一切重定向到https example.org,不是吗?您的代码应该是这样的:

来自http的请求,主机是作为www*还是不带www并不重要。所有内容都将通过https重定向到不带www的主机

server {
    listen 80; 
    server_name example.org www.example.org;
    return 301 https://example.org$request_uri;
}
如果主机是www*并通过https,则重定向到不带www的https。顺便说一句,这里您需要使用www.example.org的证书,因为没有证书连接是不安全的

server {
    listen 443 ssl http2; #https of www*, 301 to right domain.
    server_name www.example.org;
    #are you sure those 2 paths are right? with the final $.
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

    return 301 https://example.org$request_uri;
}
最后,如果它有正确的方案,有正确的主机,做任何你想做的事

server {
    listen 443 ssl http2;
    server_name example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    #do what you want to do here.
}

如果您对您的解释有任何疑问或任何我遗漏的地方,请发表评论,我会尽快解决。

Stackoverflow告诉我mysite不是一个可以用作示例的正确域,因此我将所有内容改为“示例”而不是“mysite”

我想你想要的是一切重定向到https example.org,不是吗?您的代码应该是这样的:

来自http的请求,主机是作为www*还是不带www并不重要。所有内容都将通过https重定向到不带www的主机

server {
    listen 80; 
    server_name example.org www.example.org;
    return 301 https://example.org$request_uri;
}
如果主机是www*并通过https,则重定向到不带www的https。顺便说一句,这里您需要使用www.example.org的证书,因为没有证书连接是不安全的

server {
    listen 443 ssl http2; #https of www*, 301 to right domain.
    server_name www.example.org;
    #are you sure those 2 paths are right? with the final $.
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

    return 301 https://example.org$request_uri;
}
最后,如果它有正确的方案,有正确的主机,做任何你想做的事

server {
    listen 443 ssl http2;
    server_name example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem$
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.p$
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    #do what you want to do here.
}

如果您对您的解释有任何疑问或我遗漏了什么,请发表评论,我会尽快解决。

请参阅我问题中的DNS设置:我想我已经有了正确的A记录。正如我在问题中所说的,我已经尝试在区块中添加“倾听”。我只是按照您的建议尝试添加“http2”,但没有任何区别。谢谢,我尝试将该代码添加到我的配置中,但没有任何区别。请参阅我问题中的DNS设置:我想我已经有了正确的A记录。正如我在问题中所说的,我已经尝试在区块中添加“倾听”。我只是按照你的建议添加了“http2”,但没有什么不同。谢谢,我已经尝试将代码添加到我的配置中,但没有任何不同。谢谢你提供了非常详细的答案。不幸的是,它没有起作用;www.mysite.org仍然显示Nginx页面。我复制了您的三个服务器块,并将“example”替换为“mydomainname”,并且从现有的conf文件复制了我的证书信息。否则,代码与上面所写的完全相同。https在两个URL中似乎都很好,但从www重定向到普通域不起作用。我在不同的应用程序上尝试了你的答案,在不同的水滴上,它起了作用,但我不明白为什么它在我的原始(Meteor)应用程序上不起作用,nginx中有一条错误消息,但我不明白为什么!我已经在问题的末尾添加了详细信息,如果你有什么想法的话?你还有其他服务器块吗?我的意思是,在启用的整个/nginx/sites中,您可能有两个块使用sae服务器名称侦听80,因此它与去哪里冲突。查看是否有任何隐藏文件或临时文件可能使您的配置翻倍。我的答案与服务器名称和ip冲突的唯一方式是,因为有另一个服务器块正好侦听该文件,正如我看到的,我