前文我们聊到了 httpd 的启动用户和相关权限的说明, 资源压缩配置, https 的实现, 回顾请参考 https://www.cnblogs.com/qiuhom-1874/p/12593675.html; 今天我们来说说 httpd 的重定向, HSTS, 反向代理的配置;
首先来了解下重定向吧, 什么意思呢? 假如我们访问一个资源在服务器上不存在或者不在我们对应访问 URL 下, 而用户又不知道我们新的 URL 的情况下, 我们怎么让用户访问到我们新的 URL 呢? 平常我们访问某度, 在浏览器上直接键入某度的域名, 然后浏览器就直接给我们响应, 心细的你还会发现响应的不是 http 而是 https, 我们明明没有用 https 访问某度, 为什么响应的页面却是 https 呢? 其实这就是 http 的重定向; 所谓重定向就是我们访问的 URL 对应资源不再原来的位置, 而对于用户来说, 用户数不知道 URL 背后对应的位置上哪里, 如果服务端不配置重定向, 那么用户访问到的资源要么不是最新的要么访问不到, 为了解决这样一个问题, 重定向就起着把用户的请求转发到新 URL 上的作用; 它的原理是这样的, 用户访问某一资源, 当服务端收到用户的请求后, 检查用户访问的 URL 对应资源不在原来的位置, 此时服务器会以 301 或 302 的状态码响应客户端, 意思就是告诉客户端访问的资源不再这个位置, 对应的位置服务端会通过 location 首部告诉客户端, 客户端收到这个响应报文后会再次向服务端新发来的 URL 再次请求, 得到响应的资源响应;
httpd 实现重定向需要用到 redirect 指令, 它的配置语法是 Redirect [status] URL-path URL;status 表示状态信息, permanent 表示返回永久重定向状态码 301;temp 表示返回临时重定向状态码 302. 此为默认值;
示例: 把用户访问 http 的请求临时重定向到 https
提示: 以上配置意思是用户访问 / https 这个 URI 的时候, 就会临时重定向到 https://www.test.com, 当然 redirect 这个指令可以用在 server 配置段中, 虚拟主机配置段中, 也可以用在 directory 配置段中和. htaccess 文件中;
测试:
提示: 可以看到我们访问 www.test.com/https, 浏览器访问这个 URL 时, 在响应报文中给我们了一个 location 响应首部, 并且把新的 URL 告诉我们, 然后浏览器自动去访问 location 中的新 URL , 最终把 https://www.test.com 的响应结果给我们;
示例 2: 通过 rewrite 来实现 http 访问跳转为 https
提示: 以上配置表示, 开启 rewrite 功能, 并对用户访问任何内容的的 URI 重写为 https:// 用户访问的请求报文中 host 首部 / index.HTML, 意思就是用户访问 www.test.com/abc.HTML 服务端收到这样的请求后, 它会把用户的 URL 重写为 https://www.test.com/index.html, 不管用户访问 www.test.com 下的任何内容, 都会被处理为访问 https://www.test.com/index.html
测试:
提示: 可以看到我们在浏览器上不管访问 www.test.com / 下的任何内容, 都给我们跳转为 https://www.test.com/index.html 了;
HSTS:HTTP Strict Transport Security, 翻译过来就是 http 严格传输安全, 我们通过上面的示例可以发现一个点, 就是用户第一次访问服务端的时候, 它俩是通过 http 协议传输数据, 众所周知 http 协议是明文传输数据的, 假设用户第一次访问服务端的时候, 被黑客中间把数据截获并篡改了, 可想而知, 客户端收到不是真正服务端的信息, 而是被黑客篡改了的响应报文, 后续客户端就很可能不是访问真正服务端响应给客户端的 URL, 而是黑客篡改后的, 这样一来无疑存在着安全隐患; 为了解决这样的问题, 服务器端配置支持 HSTS 后, 会在给浏览器返回的 HTTP 首部中携带 HSTS 字段. 浏览器获取到该信息后, 会将所有 HTTP 访问请求在内部做 307 跳转到 HTTPS. 而无需任何网络过程, 这样一来黑客就无法通过网络来抓取我们的信息; HSTS preload list 是 Chrome 浏览器中的 HSTS 预载入列表, 在该列表中的网站, 使用 Chrome 浏览器访问时, 会自动转换成 HTTPS.Firefox,Safari,Edge 浏览器也会采用这个列表; 意思就是在 HSTS preload list 中的网站就可以实现在浏览器内部跳转把 http 跳转为 https;
httpd 配置实现 HSTS 是通过 Header always set Strict-Transport-Security 指令实现, 后面要给定一个最大时长, 表示在给定的时长浏览器请求该网站都会使用 https 去访问;
示例:
提示: 以上表示设置 strict-transport-security 响应首部的值为 max-age=31536000, 这样配置后, 我们自己的网站就支持 HSTS
提示: 可以看到我们访问 www.test.com 对应响应报文就有 Strict-Transport-Security 响应首部;
httpd 作为代理服务器;
首先我们来了解代理的概念吧, 所谓代理就是自己没有能力去做的事, 让别人帮着做, 我们把这种帮别人干事的角色称为代理, 我不知道这样解释是否正确; 比如, 我们想去访问某网站, 但是该网站却只有特定的网络才可以访问得到, 这个时候如何让其他非特定网络的其他用户访问到呢? 其实代理就是这个作用, 作为客户端, 代理可以帮助客户端去访问特定网络的资源, 作为服务端, 代理可以帮助服务端响应客户端的请求; 它两不同的是, 在客户端的那一侧我们通常叫正向代理, 意思就是代理客户端访问特定网络资源, 这只是针对 http web 服务来讲是这样的, 但无论怎样讲, 正向代理就是帮助客户端去干某事; 在服务端一侧我们通常把代理叫做反向代理, 意思就是它代理服务端响应客户端的请求; 代理其实我们可以理解为中间的 "人", 它既当客户端, 又当服务端, 只是我们站在不同的角度对它的称呼不一样; 正向代理的角色的原理就是当客户端的报文发送到代理服务器后, 代理客户端会更改客户端的源 IP 或源端口信息; 在真正服务端上看到的请求通常是正向代理的 ip 和端口; 而对于反向代理来说, 它主要是代理服务端响应客户端的请求, 它通常是修改客户端的目标 IP 或目标端口, 在客户端响应的报文里看, 通常是代理服务器的作为响应报文的源 IP 或源端口的响应, 而在后端真正提供服务的服务端上看, 请求报文通常是反向代理服务器的源 IP 或源端口; 从上面的描述, 代理服务器承担了两个角色, 面向客户端它是服务端, 面向服务端它是客户端; 所以我们在客户端看到的响应报文源 IP 信息和端口都是代理服务器的, 在服务端看到的请求报文源端口信息也都是代理服务器的源端口信息; 通常情况下正向代理除了可以帮助客户端访问外界资源外, 它还可以起到隐藏客户端的目的; 而对于反向代理, 它除了可以帮助服务端响应客户端的请求, 同时它也可以起到隐藏服务端的作用, 这样一来, 客户端和服务端都是通过代理实现了数据交互; 在现实生活中我们访问的 Web 服务通常都是基于这两种代理来的, 这也是代理最重要的作用;
httpd 反向代理的功能是基于 proxy 模块实现的, 其中最常用也是最重要的指令是 proxypass 和 ProxyPassReverse
示例:
提示: 以上配置表示客户端访问 / nginx 这个 URI 时, 会将用户请求反代到后面我们真正指定的网站上; 也就是说我们用浏览器访问 www.test.com/nginx 就会访问到 nginx 官方主页上去;
提示: 可以看到我们在虚拟主机里加了 proxypass 和 proxypassreverse 指令后, 我们访问对应 URI, 浏览器会将我们的请求跳转到对应我们指定的 URL 上去; 当然我们也可以把 proxypass 指令用于 location 中; 而 proxypassreverse 指令的主要作用是防止客户端绕过反代服务器, 直接请求后端主机; 以上就是 httpd 简单指令的使用更多关于 httpd 指令的使用, 请参考官方文档示例说明;
来源: https://www.cnblogs.com/qiuhom-1874/p/12609986.html