Lit*_*ain 2 ssl redirect nginx
我在 DigitalOcean Ubuntu 16.04 Droplet 上有一个 Meteor 1.6 站点,使用 Phusion Passenger 和 Nginx 部署。
我已经在我的服务器上设置了 ssl。
http://mysite重定向到https://mysite并且该网站工作正常。
然而,http://www.mysite重定向到https://mysite并且显示的只是默认的 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
Run Code Online (Sandbox Code Playgroud)
然后,我按照本教程使用 Certbot 和 LetsEncrypt 配置 ssl: https://www.digitalocean.com/community/tutorials/how-to-set-up-let-s-encrypt-with-nginx-server-blocks-on- ubuntu-16-04
我添加了一个服务器块,按照本教程将 www 重定向到普通域:https: //www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-在 ubuntu-14-04 上
这是我的 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
}
Run Code Online (Sandbox Code Playgroud)
我尝试将其添加到我的服务器重定向块中,但没有什么区别:
listen 80;
listen 443 ssl;
Run Code Online (Sandbox Code Playgroud)
有什么想法可以让 www.mysite -> mysite 重定向正常工作吗?谢谢你!
更新:我在另一个应用程序上尝试了 flaixman 的答案,在另一个 Droplet 上的 Django 应用程序上,它起作用了。但我仍然无法重定向到我的 Meteor 应用程序。两个站点的 A 和 CNAME 记录配置方式相同。
这是我的 Meteor 配置,基于 flaixman 的回答:
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;
}
Run Code Online (Sandbox Code Playgroud)
在我的 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
Run Code Online (Sandbox Code Playgroud)
我希望这意味着我的conf文件中有重复的listen指令,但我看不到任何指令?我已使用 ls -a 检查过,文件夹中没有 conf 文件的第二个副本。
该错误可能与重定向失败有关,但我看不出导致该错误的原因是什么?
再次编辑:我终于在 /etc/nginx/sites-available/default 中找到了重复的监听指令。不确定 Certbot 是否插入了它们,或者我是否在设置服务器时自己将它们放在那里......无论如何,将它们注释掉似乎已经解决了问题。Phusion Passenger 设置服务器块的说明中的某些内容可能与 LetsEncrypt 说明发生冲突?不管怎样,nginx 错误日志是这样的!
Stackoverflow 告诉我 mysite 不是用作示例的正确域,因此我将所有内容更改为“example”而不是“mysite”
我想您想要的是将所有内容重定向到 https example.org,不是吗?您的代码应如下所示:
来自 http 的请求,主机是否以 www* 形式出现并不重要。一切都将被重定向到没有 www 的主机,并通过 https
server {
listen 80;
server_name example.org www.example.org;
return 301 https://example.org$request_uri;
}
Run Code Online (Sandbox Code Playgroud)
如果主机是 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;
}
Run Code Online (Sandbox Code Playgroud)
最后,如果有正确的方案和正确的主机,就可以做任何你想做的事。
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.
}
Run Code Online (Sandbox Code Playgroud)
如果您有任何疑问或我对您的解释有任何遗漏,请发表评论,我会尽快修复。
归档时间: |
|
查看次数: |
6708 次 |
最近记录: |