【发布时间】:2019-04-29 07:33:25
【问题描述】:
我有一个域 example.com。我想在其子域上运行多个应用程序并在它们上启用 https。
我已使用 certbot 为 *.example.com 和 example.com 域创建证书。
共有三个应用程序处理来自不同子域的请求。
- 应用
app1处理来自子域 abc.example.com 仅的请求。 - 应用程序
app2处理来自 [some_name].example.com 形式的子域的请求。 - 应用
app3处理来自 example.com 仅的请求。
我面临以下问题。
- 当我尝试从浏览器访问域 abc.example.com 时,它会重定向到 www.abc.example.com,然后提供无效证书错误。
- 对服务器名称使用正则表达式会导致所有请求被重定向到 app1。
- 当我尝试从浏览器访问域 example.com 时,它会重定向到 www.www.abc.example.com,这是一个无效域。
我不确定似乎是什么问题。它是服务器名称的正则表达式吗? 另外,还有其他更好的方法可以用于这种情况吗? 任何帮助表示赞赏。
注意: 应用程序作为 docker 容器托管在同一个 docker 网络中。
以下是nginx conf文件。
server {
listen 80;
listen [::]:80;
charset utf-8;
access_log off;
server_name example.com;
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
server_tokens off;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com-0001/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
return 301 https://www.example.com$request_uri;
}
server {
server_name www.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_tokens off;
ssl on;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
ssl_certificate /etc/letsencrypt/live/example.com-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com-0001/privkey.pem;
location / {
proxy_pass http://app3:80;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
listen [::]:80;
charset utf-8;
access_log off;
server_name abc.example.com;
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name abc.example.com;
server_tokens off;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
location / {
proxy_pass http://app1:80;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
listen [::]:80;
charset utf-8;
access_log off;
server_name ~^(?!abc|www).+\.example\.com$ ~^www\.(?!abc|www).+\.example\.com$;
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ~^(?!abc|www).+\.example\.com$ ~^www\.(?!abc|www).+\.example\.com$;
server_tokens off;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
location / {
proxy_pass http://app2:80;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
【问题讨论】:
-
看起来这些重定向不是由您显示的配置引起的。可能是你没有显示的配置引起的,特别是容器内运行的应用程序。
-
这些应用程序在不同的端口上运行并且完全不相关。此外,我想指出,如果我不使用 SSL,它们可以完美运行。
-
这些应用程序并非完全不相关,因为您的 nginx 设置只是这些应用程序的反向代理,并且可以发出您从应用程序内部看到的重定向。正如我所说 - 您显示的配置的任何部分都不会对这些重定向负责,因此它一定是您没有显示的内容。
-
我的意思是这些应用不会在其范围之外发出任何重定向。
-
不需要任何配置来防止这种情况,因为它不是由浏览器自己完成的。某些站点发生这种情况的唯一原因是站点显式发出重定向 - 必须在服务器配置中配置或由 Web 应用程序发出。
标签: docker ssl nginx docker-compose