请教一个 Nginx 配置和浏览器强制 http 转 https 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coolair
V2EX    NGINX

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

  •  
  •   coolair 308 天前 3815 次点击
    这是一个创建于 308 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 Nginx 配置了多个站点的情况下,如果有些站点没有启用 https (使用了通配符证书),而有些启用了 https 的话。

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

    这个有没有办法在不修改客户端浏览器的情况下解决?
    第 1 条附言    308 天前
    我发现问题是,当访问一个没配置 ssl 的域名时,比如:访问 https://a.test.com ,但是它没有配置 ssl ,那么就会跳转到配置了 ssl 的一个站点去。
    15 条回复    2025-02-13 09:57:13 +08:00
    tars13344
        1
    tars13344  
       308 天前
    这是浏览器的 HSTS 策略,没啥好办法 只能都配 https
    lpe234
        2
    lpe234  
       308 天前
    不应该啊 我一般是在 `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_add;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

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

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

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

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

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

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

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

    Nginx 的匹配是顺序匹配的,80 端口没匹配到就跑下面的 443 规则了,如果没有就会返回最后一个兜底的链接而不管 server_name 是什么,你可以试试
    kenshin912
        13
    kenshin912  
       308 天前
    我大概看懂了 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
       308 天前
    @kenshin912 #13 感谢,就是这个意思,哈哈,太棒了,解决了。
    kenshin912
        15
    kenshin912  
       307 天前
    @coolair #14 很高兴能帮到你.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2832 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:27 PVG 22:27 LAX 06:27 JFK 09:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86