› 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 · Feb 12, 2025 · 6933 views
    This topic created in 639 days ago, the information mentioned may be changed or developed.
    在 Nginx 配置了多个站点的情况下,如果有些站点没有启用 https (使用了通配符证书),而有些启用了 https 的话。

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

    这个有没有办法在不修改客户端浏览器的情况下解决?
    Supplement 1  ·  Feb 12, 2025
    我发现问题是,当访问一个没配置 ssl 的域名时,比如:访问 https://a.test.com ,但是它没有配置 ssl ,那么就会跳转到配置了 ssl 的一个站点去。
    15 replies  •  2025-02-13 09:57:13 +08:00
    tars13344
    tars13344
    Feb 12, 2025
    1
    这是浏览器的 HSTS 策略,没啥好办法 只能都配 https
    lpe234
    lpe234
    Feb 12, 2025
    2
    不应该啊 我一般是在 `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
    totoro625
    Feb 12, 2025
    3
    "如果有些站点没有启用 https (使用了通配符证书)"
    想看一下这个站点是怎么配置的,初步判断是这里出了问题

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

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

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

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

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

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

    Nginx 的匹配是顺序匹配的,80 端口没匹配到就跑下面的 443 规则了,如果没有就会返回最后一个兜底的链接而不管 server_name 是什么,你可以试试
    kenshin912
    kenshin912
    Feb 12, 2025
    13
    我大概看懂了 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
    coolair
    OP
    Feb 12, 2025
    14
    @kenshin912 #13 感谢,就是这个意思,哈哈,太棒了,解决了。
    kenshin912
    kenshin912
    Feb 13, 2025
    15
    @coolair #14 很高兴能帮到你.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2025 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 15:03 · PVG 23:03 · LAX 07:03 · JFK 10:03
    ♥ Do have faith in what you're doing.