我正在编辑一个.htaccess
文件..
在 RewriteRules 的 RewriteCondition 中,HTTPS_HOST
似乎仅匹配通过https://
协议 (ssl) 访问的 URL。我在某处文档中看到它是一个 T/F 变量,用于指示是否使用安全协议访问 URL。
但是,我在文档中找不到是否HTTP_HOST
仅匹配http://
协议,或者它是否有效地匹配//
相对协议,这意味着它匹配两个都 http://
和 https://
。
有人能以某种方式证实这一点,或者告诉我这个信息的可靠来源吗?
另外,如果HTTP_HOST
匹配两个都协议变体,过滤匹配项的最佳方法是什么仅有的 http://
协议?
例子:
<IfModule mod_rewrite.c>
RewriteEngine on
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
</IfModule>
相比之下:
...
Rewritecond %{HTTPS_HOST} ^\/\.(?!some-url).*$
...
编辑:实验表明HTTP_HOST
做似乎匹配两种协议,而HTTPS_HOST
只有当协议或 URL 以 开头时才匹配https://
。
。
(请注意:apache2
标签
TBH,我不确定我正在运行哪个版本的 apache。为了尝试找出答案,以便我可以附加正确的标签..
我尝试了httpd -v
,,,,,等等。(这不是虚拟主机的问题,我有 nginx apache -v
,无论如何它都是为那个(虚拟服务器)准备的,但我还是尝试了最后 3 个(虚拟主机)命令,看看它们是否能告诉我我的 apache 版本)。apache2ctl -S
对 这些命令的响应要么说我必须先安装 apache2,要么它是一个未知命令。 我有一个文件夹,但没有(因此没有文件夹)。 )apachectl -S
httpd -S
/etc/apache2
/usr/local/apache
/usr/local/apache/bin/httpd
答案1
没有这样的 Apache 服务器变量HTTPS_HOST
,只有HTTP_HOST
。如果HTTPS_HOST
您的服务器上设置了,那么它特定于您的服务器。
服务器HTTP_HOST
变量包含 HTTP 请求标头的值Host
(即主机名),这与使用的协议无关(HTTP 或 HTTPS)。与所有以 开头的变量一样HTTP_
,它们包含相应 HTTP 请求标头的值。
也许您正在考虑HTTPS
Apache 服务器变量?它包含值on
或off
取决于请求是否通过 HTTPS。因此,如果您没有管理 SSL 的前端代理,那么您可以HTTPS
使用服务器变量来确定请求是通过 HTTP 还是 HTTPS 协议。
参考:
我有 nginx
那么,你使用 Nginx 做什么呢?它是你的应用服务器吗?还是你将其用作前端代理?在这种情况下,HTTPS
可能根本不是要使用的变量。
更新:
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$ RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
这确实没有意义。状况(RewriteCond
指令)永远不会成功(因为Host
标头不包含斜杠),因此重定向将绝不发生。
如上所述,HTTP_HOST
服务器变量包含主机名仅,例如。example.com
或www.example.com
。它不包含 URL 路径,正如您在此处假设的那样。您的状况正在尝试匹配文字/.
不是随后some-url
(使用负向前瞻)。主机名永远不会以斜线开头(甚至不包含斜线),因此它会在第一个字符处失败。
我正在尝试修改阻止 letsencrypt 续订的 htaccess 规则,...因此,这是主要问题(.well-known 收到 403)
要针对特定 URL 路径的特定规则创建例外,您可以执行以下操作:
Rewritecond %{REQUEST_URI} !^/\.well-known
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
这将排除(注意前缀)以!
开头的任何 URL /.well-known
。!
条件模式否定正则表达式。REQUEST_URI
服务器变量包含请求的完整 URL 路径(自然不包括协议、主机名和查询字符串)。
但是,您声明“.well-known
收到 403” - 您可能需要找出触发 403 的原因并对该规则应用例外。
或者,在文件的最顶部包含一个例外.htaccess
:
# Any requests that start "/.well-known" are ignored
RewriteRule ^\.well-known - [L]
(请注意,RewriteRule
图案与 URL 路径匹配。
最初(现在可能也是其次)我认为在过期证书上要求 https 可能会有问题。
是的,这肯定会有问题。用户将得到一个浏览器警告证书无效并且请求永远不会到达您的服务器。