在Ubuntu 16.04上使用ssl从www重定向到非www在Nginx中不工作
我在DigitalOcean Ubuntu16.04微滴上有一个Meteor 1.6站点,使用Phusion Passenger和Nginx部署 我已经在我的服务器上设置了ssl 重定向到,站点工作正常 但是重定向到,显示的只是默认的Nginx页面“欢迎使用Nginx!” 我已经学习了教程并尝试了其他论坛帖子中的内容,但我找不到我的设置有什么问题 来自DigitalOcean控制面板的DNS记录:在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
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冲突的唯一方式是,因为有另一个服务器块正好侦听该文件,正如我看到的,我