如何在Apache中记录URL方案(http / https)?


Answers:


3

一种方法是有两个条件CustomLog指令,由是否设置HTTPS变量控制。

CustomLog logs/access.log "https://..." env=HTTPS
CustomLog logs/access.log "http://..." env=!HTTPS

我也尝试过SetEnvIf以以下方式使用,但不起作用(它记录-):

SetEnv URL_SCHEME=http
SetEnvIf HTTPS on URL_SCHEME=https
CustomLog logs/access.log "%{URL_SCHEME}e://..."

1
您的mod_env尝试可能因语法错误而失败。SetEnv接受不带等号的变量和值:SetEnv URL_SCHEME http
glasz 2014年

1
同样,该SetEnvIf行在apache <2.4.1上不起作用,因为mod_setenvif显然无法访问ssl环境。在2.2.22上差点让我发疯。
glasz 2014年

此环境变量似乎特定于mod_ssl。如果使用其他模块,例如mod_gnutls,则没有它。
bortzmeyer 2014年

另外,mod_ssl仅当您通过明确告诉环境变量设置环境变量时,才进行设置SSLOptions
Florian Brucker

3

由于某种原因,我无法使上述示例正常工作,因此找到了另一种方法:您可以向配置中添加2个重写规则,如下所示:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [E=SCHEME:HTTP]

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [E=SCHEME:HTTPS]

然后将其添加到您的LogFormat定义中。

scheme=\"%{SCHEME}e\"

3

由于url方案不是直接以apache日志格式提供,因此您可以使用%p作为替代方法来记录服务请求的服务器的规范端口(例如80/443):

CustomLog access.log "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" port:%p"

怎么这么快就得到了两次投票?无论如何,如果您想有效地记录需要协议URI方案的请求的URL,这将无用。
弗拉基米尔·潘捷列夫

端口指示协议。
Wick 2016年


-2

定义您的日志输出并向其中添加%H。这与Apache相同。

因此,您构建了一个LogFormat这样的程序,并且afaik在默认的Apache配置中定义了几个。

LogFormat "%h %l %u %t \"%r\" %>s %b" common

并将LogFormat的名称(在本例中为“ common”)添加到日志文件调用的末尾

CustomLog logs/access_log common

只需在此处查看有关日志的更多信息以及在此处有关不同格式字符串的信息。


1
嗯...我已经看过了 我在问题中说,这%H并不能满足我的需求。
弗拉基米尔·潘捷列夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.