【发布时间】:2014-08-11 13:14:56
【问题描述】:
我有一个相当复杂的 Ruby 应用程序,它为客户提供了一个仪表板,可以在他们自己选择的子域下使用。即:http://mycompany.app.com、http://myproject.app.com。
我还在根域(即http://app.com)上运行了产品网站,并且我已经购买并使用 Nginx 配置了 SSL 证书,它按预期工作,但这给我留下了以下问题场景:
我需要将所有非 https 流量重定向到页面的 https 版本,但发往任何子域的任何请求除外。棘手的是,我确实需要将网站的 www 版本重定向到非 www 版本。
http://app.com -> https://app.com
http://www.app.com -> https://app.com
http://nike-admin.app.com !-> https://nike-admin.app.com
这是我到目前为止在 nginx.conf 中为这个应用程序提出的内容(真实名称替换为app):
upstream unicorn_server {
server unix:/var/www/<app>/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
server_name <app>.co;
location / {
rewrite ^ https://$server_name$request_uri permanent;
}
}
server {
server_name <app>.co;
root /var/www/<app>.co/public;
client_max_body_size 4G;
keepalive_timeout 70;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/<app>.crt;
ssl_certificate_key /etc/nginx/ssl/<app>.key;
location / {
try_files $uri @app;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn_server;
}
}
在第一个 server{} 块中,我明确侦听端口 80 上的任何连接并将其重定向到 https 版本,但这是一把双刃剑,因为 SSL 证书仅涵盖 apex 域。我不希望将 www 以外的任何子域上的请求重定向到 https 等效项。
我可能会使用正则表达式,但从我在网上看到的情况来看,它似乎不被接受?
还有其他方法吗?
【问题讨论】:
-
“我可能会使用正则表达式,但从我在网上看到的情况来看,它似乎不受欢迎?” -- 你是什么意思?我不会为此使用 RegEx 皱眉。你在哪里看到的?
-
正则表达式引擎是有限状态的,大多数时候你会发现写几行正则表达式比写几块代码更容易维护。对于您将经常使用的专用服务,性能确实很重要,但在这种情况下,请使用正则表达式。
-
应用程序使用非 HTTPS 的任何特殊原因?你希望 cookie 被盗吗?
-
@mikhailov 子域上的仪表板是一次性只读的,包含非敏感数据,因此在这种情况下,通配符 SSL 证书的成本没有意义。