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

nginx 取消 https 后发现 chrome 访问提示重定向过多无法访问。

  •  
  •   smallaccount · 283 天前 · 3147 次点击
    这是一个创建于 283 天前的主题,其中的信息可能已经有所发展或是发生改变。
    取消了https rewrite 到了http,但是发现 chrome 访问提示重定向过多无法访问。
    自己可以清楚 cookie 解决,但是用户怎么办啊。
    或者是我哪里设置有问题?
    比如说,如何告诉浏览器我修改了nginx的配置文件?
    第 1 条附言  ·  283 天前
    nginx 配置

    server {
    listen 80;
    server_name domain.com www.domain.com;
    if ($host != 'www.domain.com')
    {
    rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
    }
    location / {
    proxy_pass http://127.0.0.1:8000/;
    limit_req zone=one burst=20 nodelay;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    }
    location /static {
    alias /var/www/domain/static;
    }
    }
    server {
    listen 443 ssl;
    server_name domain.com www.domain.com;

    rewrite ^/(.*)$ http://www.domain.com/$1 permanent;

    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
    }
    第 2 条附言  ·  281 天前
    @allenhu 31 楼大神指明了原因。。。具体看 34 楼。
    36 回复  |  直到 2016-12-16 12:15:29 +08:00
        1
    lslqtz   283 天前   ♥ 1
    这就是你配置有问题。
    还有,有任何问题贴配置是常识了,大量答案都提到了。
        2
    stabc   283 天前   ♥ 1
    换个浏览器正常么?
        3
    raysonx   283 天前   ♥ 1
    你这是设置了从 HTTPS 跳转到 HTTP 了吧?
    目测浏览器缓存了 HTTP 到 HTTPS 的跳转( 301 跳转会缓存),然后你再设置从 HTTPS 跳到 HTTP ,不断循环
        4
    smallaccount   283 天前
    @raysonx 是这样的,如果清除 cookie ,缓存消失就正常了。但是如何无痛换到 http 呢?用户不会清楚 cookie 。
    @stabc 清除 cookie 后正常
    @lslqtz 最讨厌的就是『大量答案都提到了』,然后还不给解决办法的回答。
        5
    lhbc   283 天前 via iPhone   ♥ 1
    https 里面不要直接跳 /,改为跳 http://www.example.com/?from_https 这样
    后面加个尾巴
        7
    lslqtz   283 天前   ♥ 1
    @smallaccount 最讨厌的就是『大量答案都提到了』
    配置都不贴,都靠猜着给你回答?
        8
    lslqtz   283 天前   ♥ 1
    @raysonx 是的, 301 跳转缓存时间很长。
    一般来说,我在 301 时都会提供 no-cache 的头。
    @lhbc 我习惯加时间戳 :v
        9
    raysonx   283 天前   ♥ 1
    题外话,话说我自己的域名已经设置了 HSTS ,而且已经内置在了 Chrome 的静态 HSTS 名单里,永远不可能改回 HTTP 了。
        10
    lslqtz   283 天前
    对于一键不确定的事情,请用 302 。
    @raysonx 我有可能域名会过期,不给后来人添麻烦就没加 HSTS :a
        11
    tomczhen   283 天前 via Android
    @lslqtz 小心人家说你小气,说你不想回答就别回答。:doge:
        12
    mkeith   283 天前
    1L 的意思 『大量答案都提到了』问问题要贴配置
        13
    stabc   283 天前
    @lslqtz 感觉 @lhbc 说的方法不错,你说“我习惯加时间戳”,具体是怎样加的?提示跳转过多时浏览器地址栏上是什么?
        14
    lslqtz   283 天前
    @stabc ?时间戳
    或者?版本号都行 :D
        15
    anheiyouxia   283 天前
    @smallaccount 连配置都不贴,还怪别人说不?
        16
    stabc   283 天前
    @lslqtz 那你提示跳转过多时浏览器地址栏上是什么?(可以把域名隐掉)
        17
    smallaccount   283 天前 via iPhone
    @lslqtz 不好意思…稍等。
        18
    smallaccount   283 天前
        19
    flynaj   283 天前 via Android   ♥ 1
    curl 看一下
        20
    smallaccount   283 天前
    @flynaj curl 结果是:
    <html>
    <head><title>301 Moved Permanently</title></head>
    <body bgcolor="white">
    <center><h1>301 Moved Permanently</h1></center>
    <hr><center>nginx/1.4.6 (Ubuntu)</center>
    </body>
    </html>
        21
    loveyu   283 天前   ♥ 1
        22
    lslqtz   283 天前 via iPhone
        23
    lslqtz   283 天前 via iPhone
    顺便向各位道个歉:我说配置有问题可能太果断,但以后可以在跳转的域名中加入以下指令:
    add_header Cache-Control no-cache
        24
    smallaccount   283 天前
    @loveyu http 的话直接显示网页内容了, https 的话和上面的那个一样。。。
        25
    loveyu   283 天前
    @smallaccount 我指这类数据
    curl -I http://www.v2ex.com
    HTTP/1.1 302 Moved Temporarily
    Server: nginx/1.11.6
    Date: Wed, 14 Dec 2016 14:54:04 GMT
    Content-Type: text/html
    Content-Length: 161
    Connection: keep-alive
    Location: https://www.v2ex.com/
    X-ORCA-Accelerator: from 093.chn.fuo01.cn.krill.c3edge.net
        26
    smallaccount   282 天前
    @flynaj

    @loveyu 纯小白,刚才写成 curl -l 了,应该是 curl -I.

    http
    HTTP/1.1 200 OK
    Server: nginx/1.4.6 (Ubuntu)
    Date: Wed, 14 Dec 2016 14:46:53 GMT
    Content-Type: text/html; charset=utf-8
    Content-Length: 7996
    Connection: keep-alive
    Cache-Control: no-cache

    https
    HTTP/1.1 302 Moved Temporarily
    Server: nginx/1.4.6 (Ubuntu)
    Date: Wed, 14 Dec 2016 14:48:01 GMT
    Content-Type: text/html
    Content-Length: 169
    Connection: keep-alive
    Location: http://www.domain.com/

    重新设置为 302 了,目前依旧无法正常访问。

    @lslqtz 方法没用,加了,加在 proxy_set_header X-Real-IP $remote_addr;下面了,还不行。。。

    目前设置:
    server {
    listen 80;
    server_name domain.com www.domain.com;
    if ($host != 'www.domain.com')
    {
    rewrite ^/(.*)$ http://www.domain.com/$1 redirect;
    }
    proxy_cache_valid 301 1m;
    location / {
    proxy_pass http://127.0.0.1:8000/;
    limit_req zone=one burst=20 nodelay;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    add_header Cache-Control no-cache;
    }
    location /static {
    alias /var/www/domain/static;
    }
    }
    server {
    listen 443 ssl;
    server_name domain.com www.domain.com;
    proxy_cache_valid 301 1m;

    rewrite ^/(.*)$ http://www.domain.com/$1 redirect;

    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
    }
        27
    smallaccount   282 天前
    @raysonx 我觉得你说的最靠谱,主要是 chrome 缓存了 301 的问题,但是怎么清楚客户端 chrome 的 301 缓存呢?
        28
    figofuture   282 天前   ♥ 1
    这篇帖子有回答 https://www.v2ex.com/t/314217
        29
    lslqtz   282 天前
    @smallaccount 我觉得没什么办法。
    因为 https 到 http 缓存了, http 到 https 又缓存了。
    给你的配置是避免以后出问题的。。
        30
    smallaccount   282 天前
    @figofuture 问题和我一样,很多人都答非所为,目测没有题主解决。
        31
    allenhu   282 天前 via Android   ♥ 2
    hsts 设置了 Strict-Transport-Security: max-age 吧
        32
    lslqtz   281 天前
    @allenhu 我觉得这样还是没法解决 https 跳转到 http
        33
    lslqtz   281 天前
    @smallaccount 我建议通知客户手动清除,下次加 no-cache 。。
        34
    smallaccount   281 天前
    @allenhu 非非非常感谢!!!
    纯小白什么也不懂,我是按照 digitalocean 上给的教程配置的
    https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04

    然后这个教程设置了 Strict-Transport-Security: max-age ,所以导致了上述的情况, http 直接无法访问,全部都跳转到 https 了,取消设置之后 http 和 https 都可以访问了。 digitalocean 设置的是 15768000 , 182.5 天。。。好吧,只能等用户自己清除了,我这边先把 https 加上去好了,等到半年后再把 https 撤下来,估计差不多。。


    @lslqtz chrome 客户端缓存可能是无法解决了,但是终于知道原因了。
        35
    lslqtz   281 天前   ♥ 1
    @smallaccount chrome://net-internals/#hsts
    这里可以清理,只要没有加入列表。
    我以为你是普通的 301 。。没想到你开了 HSTS
        36
    smallaccount   281 天前
    @lslqtz 的确应该把配置 https 和取消 https 之后的两个配置文件都贴上去的。。。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1218 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 67ms · UTC 01:21 · PVG 09:21 · LAX 18:21 · JFK 21:21
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1