首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HTTP_HOST和HTTPS_HOST在Apache.htaccess文件中有什么区别?

HTTP_HOST和HTTPS_HOST在Apache.htaccess文件中有什么区别?
EN

Server Fault用户
提问于 2019-02-08 18:02:12
回答 1查看 51.7K关注 0票数 11

我在编辑一个.htaccess文件。

在RewriteCondition for RewriteRules中,HTTPS_HOST似乎只匹配通过https://协议(ssl)访问的urls。我在文档中看到,它是一个T/F变量,它指示是否使用安全协议访问url。

但是,我很难在文档上找到HTTP_HOST是否只匹配http://协议,或者它是否有效地匹配了//相关协议,这意味着它既匹配http://又匹配https://

有人能确认其中一种或另一种方式,或指向我一个明确的来源为这一信息?

另外,如果HTTP_HOST与这两种协议变体匹配,那么只对http://协议的匹配进行筛选的最佳方法是什么?

示例:

代码语言:javascript
运行
复制
RewriteEngine on
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]

相反:

代码语言:javascript
运行
复制
...
Rewritecond %{HTTPS_HOST} ^\/\.(?!some-url).*$
...

编辑:实验表明,HTTP_HOST似乎匹配这两种协议,而HTTPS_HOST只在协议或url以https://开头时才匹配。

(注意:apache2标记TBH,我不确定我正在运行哪个版本的apache。试着找出来,这样我就能贴上合适的标签了。我尝试了httpd -v__、apache -v__、apache2ctl -S__、apachectl -S__、httpd -S__等等(这不是一个虚拟主机问题,而且我有nginx,不管怎么说,它都是针对那个(虚拟服务器)的,但我还是尝试了最后的3(虚拟主机)命令,看看它们是否会对我的apache版本有所启发)。对这些命令的响应说,要么我必须首先安装apache2,要么是一个未知的命令。我有一个/etc/apache2文件夹,但没有/usr/local/apache (因此没有/usr/local/apache/bin/httpd文件夹)。)

EN

回答 1

Server Fault用户

回答已采纳

发布于 2019-02-08 19:00:26

没有这样的Apache服务器变量HTTPS_HOST,只有HTTP_HOST。如果在您的服务器上设置了HTTPS_HOST,那么它就特定于您的服务器。

HTTP_HOST服务器变量包含Host HTTP请求头的值(即。(主机名),这与所使用的协议(HTTP或HTTPS)无关。与启动HTTP_的所有变量一样,它们包含相应的HTTP请求头的值。

也许您正在考虑HTTPS Apache服务器变量?这包含值onoff,这取决于请求是否在HTTPS上。因此,如果您没有一个前端代理来管理SSL,那么您将使用HTTPS服务器变量来确定请求是基于HTTP还是HTTPS协议。

参考资料:

我有nginx

你用Nginx做什么?是你的应用服务器吗?还是将其用作前端代理?在这种情况下,HTTPS最终可能不是要使用的变量。

<#>更新:

重写%{HTTP_HOST} ^\/.(?!一些url).*$ RewriteRule (.*) https://www.example.com/$1

这没什么意义。条件(RewriteCond指令)永远不会成功(因为Host头从来不包含斜杠),所以重定向永远不会发生。

如上所述,HTTP_HOST服务器变量仅包含主机名,例如。example.comwww.example.com.它不包含URL路径,就像您在这里假设的那样。您的条件是试图匹配文字/.,而不是some-url (使用负查找)。主机名不会以(甚至包含)斜杠开头,因此它在第一个字符处失败。

我试图修改一个阻止更新的htaccess规则,.这就是主要的问题(.众所周知的是得到403分)

要对特定URL路径的特定规则进行异常处理,您可以执行如下操作:

代码语言:javascript
运行
复制
Rewritecond %{REQUEST_URI} !^/\.well-known
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]

这不包括(注意!前缀)任何启动/.well-known的URL。!前缀在CondPattern上否定正则表达式。REQUEST_URI服务器变量包含来自请求的完整URL路径(这自然不包括协议、主机名和查询字符串)。

但是,您可以声明".well-known获得了403“--您可能需要找出是什么触发了403,并对该规则应用了一个例外。

或者,在.htaccess文件的顶部包含一个单独的异常:

代码语言:javascript
运行
复制
# Any requests that start "/.well-known" are ignored
RewriteRule ^\.well-known - [L]

(请注意,RewriteRule模式中没有与URL路径匹配的斜杠前缀。)

最初(也许现在也是次等的),我认为需要在过期的证书上使用https可能是个问题。

是的,这肯定是个问题。用户将得到一个浏览器警告证书无效,并且请求永远不会到达您的服务器。

票数 17
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/953020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档