V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
coolair
V2EX  ›  NGINX

请教一个 Nginx 配置和浏览器强制 http 转 https 问题

  •  
  •   coolair · 8 天前 · 1815 次点击
    在 Nginx 配置了多个站点的情况下,如果有些站点没有启用 https (使用了通配符证书),而有些启用了 https 的话。

    在浏览器中访问没有启用 https 的域名,会强制跳转到 https ,导致解析到启用了 https 的网站,而不是自己 http 的网站。

    这个有没有办法在不修改客户端浏览器的情况下解决?
    第 1 条附言  ·  8 天前
    我发现问题是,当访问一个没配置 ssl 的域名时,比如:访问 https://a.test.com ,但是它没有配置 ssl ,那么就会跳转到配置了 ssl 的一个站点去。
    15 条回复    2025-02-13 09:57:13 +08:00
    tars13344
        1
    tars13344  
       8 天前
    这是浏览器的 HSTS 策略,没啥好办法 只能都配 https
    lpe234
        2
    lpe234  
       8 天前
    不应该啊 我一般是在 `conf.d` 目录下一个项目一个配置文件。 如: `xxx.xx.conf`

    upstream home {
    server 127.0.0.1:28090;
    }

    server {
    listen 80;
    server_name xxx.xxx;

    rewrite ^ https://$http_host$request_uri? permanent; # force redirect http to https
    }

    server {
    listen 443 ssl http2;
    server_name xxx.xxx;

    index index.html;
    root /mnt/www/xxx.xxx;

    location / {
    proxy_pass http://home;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

    并不会出现你说的这个问题
    totoro625
        3
    totoro625  
       8 天前
    "如果有些站点没有启用 https (使用了通配符证书)"
    想看一下这个站点是怎么配置的,初步判断是这里出了问题

    没有启用 https 就不要配置证书,没有配置证书就是一个正常的 http 站点

    排除方式:使用一个全新的浏览器环境,直接访问 http 站点,看一下是否存在问题
    yulgang
        4
    yulgang  
       8 天前
    强制跳转到 https 是浏览器行为。

    我猜测他是先尝试连 443 端口,你可以把服务器 443 端口临时关了试一试

    如果你的服务器可以联网的话,可以考虑使用比如 let's encrypt 这样的免费证书,acme.sh 可以自动签发 reload nginx 的
    coolair
        5
    coolair  
    OP
       8 天前
    @totoro625 #3 是不是通配符证书导致的?
    lneoi
        6
    lneoi  
       8 天前
    看意思是 https 是配全局了,每个站点分开来配应该就行了吧
    另一种统一入口的话,nginx 内部代理一下可以将 https 代理到 http
    coolair
        7
    coolair  
    OP
       8 天前
    @yulgang #4 使用的自动签发的证书
    zhanlanhuizhang
        8
    zhanlanhuizhang  
       8 天前
    你 nginx 配置错误了吧,我的也是你这样的,没有问题呀。
    lslqtz
        9
    lslqtz  
       8 天前
    ssl 建议有一个默认块来兜底全部请求 (包括非 https 网站的).
    jiangzm
        10
    jiangzm  
       8 天前
    https 请求跳转到另一个 https 站点,100%是 nginx 配置问题, 这个看配置就知道问题在哪

    你的 A 站只启用了 http 但是当前 ip 有 443 端口,你访问 A 域名的 https 肯定是能接收到请求的, 正确做法是所有的 https server_name 都指定具体域名不要写通配域名“*.xx.com”也不要兜底的"_"。

    这样访问 A 站肯定没有 https 服务了。
    Akasoent
        11
    Akasoent  
       8 天前
    配置文件脱敏后发出来。
    Xheldon
        12
    Xheldon  
       8 天前
    > 我发现问题是,当访问一个没配置 ssl 的域名时,比如:访问 https://a.test.com ,但是它没有配置 ssl ,那么就会跳转到配置了 ssl 的一个站点去。

    Nginx 的匹配是顺序匹配的,80 端口没匹配到就跑下面的 443 规则了,如果没有就会返回最后一个兜底的链接而不管 server_name 是什么,你可以试试
    kenshin912
        13
    kenshin912  
       8 天前
    我大概看懂了 OP 的意思 .
    在一个配置了多个虚拟主机配置文件的 Nginx 中 , 当请求某个只配置了 HTTP 的站点时 , 由于浏览器默认访问 HTTPS , Nginx 返回了另一个 HTTPS 的站点 , 这样就存在一些安全问题 , 是吗 ?

    我这里是这么做的 , 在 Nginx.conf 中修改默认配置 , 启用 ssl_reject_handshark .

    ```nginx
    ######################## default ############################

    geo $public_ip {
    default 1;
    127.0.0.0/8 0;
    10.0.0.0/8 0;
    172.16.0.0/16 0;
    }

    server {
    server_name _;
    #listen 80 default_server;
    listen 443 ssl default_server;

    ssl_reject_handshake on;

    if ($public_ip) {
    return 444;
    }

    error_page 400 494 495 496 497 =444 /;

    root /xxx/xxxx/default;
    index index.html;

    }

    ```
    coolair
        14
    coolair  
    OP
       7 天前
    @kenshin912 #13 感谢,就是这个意思,哈哈,太棒了,解决了。
    kenshin912
        15
    kenshin912  
       7 天前
    @coolair #14 很高兴能帮到你.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3195 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:55 · PVG 19:55 · LAX 03:55 · JFK 06:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.