没有代理无法正确加载 https 网站

https website cannot be properly loaded without proxy

我有一个网站,主页上有一个论坛(使用 Xenforo 创建)。我最近将 HTTPS 与 Let's encrypt 放在一起(我已使用 cPanel 在服务器端启用它)。该网站在 HTTP 下运行良好。

现在我有了 HTTPS,但我遇到了问题,因为有些人可以一如既往地访问该网站,而其他人则不能。无法打开我的网站的人必须使用代理然后才能加载网站。

我在 .htaccess 文件中编辑了一行后开始出现此错误:

#   Mod_security can interfere with uploading of content such as attachments. If you
#   cannot attach files, remove the "#" from the lines below.
<IfModule mod_security.c>
    SecFilterEngine Off
    SecFilterScanPOST Off
</IfModule>

ErrorDocument 401 default
ErrorDocument 403 default
ErrorDocument 404 default
ErrorDocument 405 default
ErrorDocument 406 default
ErrorDocument 500 default
ErrorDocument 501 default
ErrorDocument 503 default

<IfModule mod_rewrite.c>
    RewriteEngine On

    # I HAVE ADDED THESE 2 NEW LINES
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://forums.example.com/ [R,L]

    #   If you are having problems with the rewrite rules, remove the "#" from the
    #   line that begins "RewriteBase" below. You will also have to change the path
    #   of the rewrite to reflect the path to your XenForo installation.
    #RewriteBase /xenforo

    #   This line may be needed to enable WebDAV editing with PHP as a CGI.
    #RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^(data/|js/|styles/|install/|favicon\.ico|crossdomain\.xml|robots\.txt) - [NC,L]
    RewriteRule ^.*$ /index.php [NC,L]

</IfModule>

我添加了这两行:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://forums.example.com/ [R,L]

现在我遇到了一个奇怪的问题:有些人可以访问我的网站,有些人不能,他们必须使用代理!

我添加了这些规则,因为我需要将所有 http 重定向到 https,因此 http://forums.example.com/ 必须变为 https://forums.example.com/。我以前从未遇到过这个问题。有什么想法吗?

第一个

这些人收到的具体错误消息是什么?

当我构建 Greenlock 时,我遇到了类似的问题,结果证明该证书没有被正确加载,所以我假设这是一个来自 "privacy error" 的 TLS浏览器,不是 DNS 或 HTTP 问题。

下一个

我对cPanel不熟悉,但是我对ACME标准和客户端非常熟悉。

Greenlock、certbot 和许多其他 Let's Encrypt 客户端使用如下命名证书文件的约定:

  • privkey.pem
  • cert.pem
  • chain.pem
  • fullchain.pem (cert.pem + chain.pem)

有些还有bundle.pem (fullchain.pem + privkey.pem).

许多 Web 服务器在其文档中要求使用 CRT 和 KEY。直觉上你可能认为 CRT 是 cert.pem 而 KEY 是 privkey.pem

这通常是不正确的。

CRT 是 fullchain.pem

如果您的站点配置为使用 cert.pem 而不是 fullchain.pem 作为 CRT,您将遇到您描述的问题。

原因是,任何访问过 任何 站点并正确使用相同 中间权限 的人都会看到预期的页面- 必要的 chain.pem 已经存在于浏览器的缓存中。

但是,如果浏览器的缓存中没有丢失的部分,任何人都会收到安全错误。

为什么要通过代理工作?

这取决于 "proxy" 的类型 - 因为这对不同的人可能有不同的含义。

我的猜测是代理被用于比该人的浏览器更多的站点(特别是许多使用相同链的小型爱好者站点)并且代理可能实际上正在下载站点,对其进行解密,然后转发它,或者代理可能以某种方式用自己的缓存补充证书链。

浏览器隐私错误的可能解决方案

您的问题可能与我遇到的问题完全不同。症状听起来如此相似可能是巧合。

我不想把你带入一个无处可去的兔子洞,但我认为检查你的设置以确保你使用的是 fullchain.pem 而不是 cert.pem 是重要的第一步。

.htaccess 重定向的可能解决方案

重定向问题对我来说听起来很巧合。我怀疑这是否相关。

很可能在您的网站强制使用 https 后,更多使用缓存中没有 Let's Encrypt 中间证书的浏览器的访问者突然开始注意到这个问题,因为他们现在受到了影响。

但是,如果您可以撤销这些更改并确认 HTTPS (SSL-enabled) 对这些用户有效,那么我建议您不要进行重定向,而是尝试添加 headers将做同样的事情: