全部。我遇到了语法问题。我尝试过按照其他来源操作,但就是不起作用。
我已成功创建无条件 HTTP 到 HTTPS 重定向。转到http://www.robjvargas.com,最终以 HTTPS 结束。一切顺利。
但现在我的证书似乎需要 HTTP。它使用 Let's Encrypt,因此需要每 90 天更新一次。重定向生效后,试运行会失败。重定向关闭后,试运行会成功。
因此我尝试加入 RewriteCond 来免除证书更新流量:
# HTTP to HTTPS redirect
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{Request_URI} !^./acme-challenge/*
RewriteRule (.*) https://www.robjvargas.com$1 [R,L]
只是它不起作用。我觉得我错过了一些值得一看的东西,但我没有看到它。使用上面的代码,HTTP 到 HTTPS 重定向似乎仍然通用。所以,很明显,RewriteCond 是不正确的。URI 之前的句号可能是错误的,但我尝试过有和没有这个的两种情况。
我还将完整的 URI 放入了 RewriteCond,但这也没有免除它。
我已经接近了。我没有收到任何错误。它只是从未满足预期条件。
我错过了什么?
答案1
但现在我的证书似乎需要 HTTP。
这不太正确。我个人是通过 https 进行续订的。但是,为了使其正常工作,您需要确保通过从 http VirtualHost 复制相关部分来允许访问 https VirtualHost 中的质询 URI。如果您不能或不想这样做,以下是使用您开始编写的条件重定向使其通过 http 工作的方法。
问题是您当前的正则表达式将匹配挑战 uri。根据Apache 文档REQUEST_URI 以 / 开头,因此您应该像这样查找挑战 URI:^\/\.well-known\/.*$
。这将匹配挑战 URI(http://example.com/.well-known/acme-challenge)。
综合起来:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^\/\.well-known\/.*$
RewriteRule (.*) https://www.robjvargas.com/$1 [R,L]
如果将来出现问题,请使用以下方法:htaccess 测试器
答案2
在我的 Virtualmin 服务器中,下面这行代码就起到了作用。
RedirectMatch ^/(?!.well-known)(.*)$ https://phpmyadmin.example.com/$1