我在编辑一个.htaccess
文件。
在RewriteCondition for RewriteRules中,HTTPS_HOST
似乎只匹配通过https://
协议(ssl)访问的urls。我在文档中看到,它是一个T/F变量,它指示是否使用安全协议访问url。
但是,我很难在文档上找到HTTP_HOST
是否只匹配http://
协议,或者它是否有效地匹配了//
相关协议,这意味着它既匹配http://
又匹配https://
。
有人能确认其中一种或另一种方式,或指向我一个明确的来源为这一信息?
另外,如果HTTP_HOST
与这两种协议变体匹配,那么只对http://
协议的匹配进行筛选的最佳方法是什么?
示例:
RewriteEngine on
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
相反:
...
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
文件夹)。)
发布于 2019-02-08 19:00:26
没有这样的Apache服务器变量HTTPS_HOST
,只有HTTP_HOST
。如果在您的服务器上设置了HTTPS_HOST
,那么它就特定于您的服务器。
HTTP_HOST
服务器变量包含Host
HTTP请求头的值(即。(主机名),这与所使用的协议(HTTP或HTTPS)无关。与启动HTTP_
的所有变量一样,它们包含相应的HTTP请求头的值。
也许您正在考虑HTTPS
Apache服务器变量?这包含值on
或off
,这取决于请求是否在HTTPS上。因此,如果您没有一个前端代理来管理SSL,那么您将使用HTTPS
服务器变量来确定请求是基于HTTP还是HTTPS协议。
参考资料:
我有nginx
你用Nginx做什么?是你的应用服务器吗?还是将其用作前端代理?在这种情况下,HTTPS
最终可能不是要使用的变量。
<#>更新:
重写%{HTTP_HOST} ^\/.(?!一些url).*$ RewriteRule (.*) https://www.example.com/$1
这没什么意义。条件(RewriteCond
指令)永远不会成功(因为Host
头从来不包含斜杠),所以重定向永远不会发生。
如上所述,HTTP_HOST
服务器变量仅包含主机名,例如。example.com
或www.example.com
.它不包含URL路径,就像您在这里假设的那样。您的条件是试图匹配文字/.
,而不是some-url
(使用负查找)。主机名不会以(甚至包含)斜杠开头,因此它在第一个字符处失败。
我试图修改一个阻止更新的htaccess规则,.这就是主要的问题(.众所周知的是得到403分)
要对特定URL路径的特定规则进行异常处理,您可以执行如下操作:
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
文件的顶部包含一个单独的异常:
# Any requests that start "/.well-known" are ignored
RewriteRule ^\.well-known - [L]
(请注意,RewriteRule
模式中没有与URL路径匹配的斜杠前缀。)
最初(也许现在也是次等的),我认为需要在过期的证书上使用https可能是个问题。
是的,这肯定是个问题。用户将得到一个浏览器警告证书无效,并且请求永远不会到达您的服务器。
https://serverfault.com/questions/953020
复制相似问题