squid 不会记录完整的 URL,因为 squid 无法知道完整的 URL。
squid 处理 HTTP 和 HTTPS 请求的方式完全不同。对于 HTTP 请求,squid 的行为主要类似于 HTTP 服务器,但对于 HTTPS 请求,squid 只需与远程服务器建立一个套接字,在客户端中打补丁并让开。
如果 squid 试图直接与远程服务器本身对话并将连接传递给客户端,它实际上是在尝试执行中间人攻击。
让我们看一下对http://example.com/foo/bar/baz 的一些示例请求,以了解请求的具体内容。
直接http请求
GET /foo/bar/baz HTTP/1.1
User-Agent: curl/7.15.5
Host: example.com
Accept: */*
从 squid 看到的 Http 请求
GET example.com/foo/bar/baz HTTP/1.1
User-Agent: curl/7.15.5
Host: example.com
Pragma: no-cache
Accept: */*
Proxy-Connection: Keep-Alive
如您所见,HTTP 请求几乎相同,只是多了几个标头,最值得注意的是,GET 行请求完整的 URI。
直接 https 请求
这里没什么可看的,所有内容都是加密的,tcpdump 显示一个套接字已打开到example.com,但该交互的每一点都是加密的(隐私万岁!)。
从 squid 看到的 Https 请求
CONNECT example.com:443 HTTP/1.0
Host: example.com:443
User-Agent: curl/7.15.5
Proxy-Connection: Keep-Alive
当 squid 收到该请求时,它拥有它需要知道的所有信息,然后它可以打开一个到请求的服务器的套接字,此时客户端和服务器执行 TLS 握手并最终开始正常的 HTTP 通信(就像第一个示例一样),squid 只是通过加密的流量,无法看到更深的内容。
因此,当 squid 记录这些请求时,它会为您提供它所拥有的一切,使用 HTTP 它能够看到完整路径,因此它会记录完整路径,使用 HTTPS 它只有主机和端口,所以它记录的就是这些。