3.4 HTTP资源位置 – HTTPLoc
HTTP资源位置HTTPLoc代表的是请求资源在某个监听服务下的某个虚拟主机里的目录位置,HTTPLoc代表的是请求路径,根据HTTPMsg中的客户端请求数据,最终基于各种资源匹配规则,找到HTTPListen、HTTPHost、HTTPLoc后,基本确定了当前请求的资源位置、处理方式等。一个网站对应的虚拟主机下,可以有多种功能和资源类别的资源位置HTTPLoc,如图像文件放置在image为根的目录下,PHP文件需要采用FastCGI转发给php-fpm解释器等。
HTTP资源位置的配置信息格式参考如下:
location = { type = server; path = [ ".(h|c|apk|gif|jpg|jpeg|png|bmp|ico|swf|js|css)$", "~*" ]; root = /opt/ejet/httpdoc; index = [ index.html, index.htm ]; expires = 30D; cache_file =
;}location = { path = [ '^/view/([0-9A-Fa-f]{32})$', '~*' ]; type = proxy; passurl = http://cdn.ejetsrv.com/view/$1; root = /opt/cache/; cache = on; cache file = /opt/cache/${request_header[host]}/view/$1;}location = { type = fastcgi; path = [ ".(php|php?)$", '~*']; passurl = fastcgi://localhost:9000; index = [ index.php ]; root = /opt/ejet/php;}location = { path = [ '/' ]; type = server; script = { try_files $uri $uri/ /index.php?$query_string; }; index = [ index.php, index.html, index.htm ];}
HTTP资源位置HTTPLoc是通过路径名path和匹配类型matchtype来作为其标识,路径名为配置中设置的名称,客户端请求的路径名通过匹配类型定义的匹配规则来跟设置的路径名进行匹配,如果符合匹配,则该请求使用此资源位置HTTPLoc。
匹配规则matchtype一般定义在配置文件中path数组里的第二项,分为如下几种:
精准匹配,使用等于号’=’
前缀匹配,使用’^~’这两个符号
区分大小写的正则表达式匹配,使用’~’符号
不区分大小写的正则表达式匹配,使用’~*’这两个符号
通用匹配,使用’/’符号,如果没有其他匹配,任何请求都会匹配到
匹配的优先级顺序为: (location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
eJet系统根据功能服务形式,对资源位置HTTPLoc定义了几种类型:Server、Proxy、FastCGI等,通常情况下,一个资源位置HTTPLoc只属于一种类型。
HTTP资源位置HTTPLoc都需要一个缺省的根目录,指向当前资源所在的根路径,客户端请求的路径都是相对于当前HTTPLoc下的root跟目录来定位文件资源的。对于Proxy模式,根目录一般充当缓存文件的根目录,即需要对Proxy代理请求回来的内容缓存时,都保存在当前HTTPLoc下的root目录中。
每个HTTPLoc下都会有缺省文件选项,可以配置多个缺省文件,一般设置为index.html等。使用缺省文件的情形是客户端发起的请求只有目录形式,如http://www.xxx.com/,这时该请求访问的是HTTPLoc的根目录,eJet系统会自动地依次寻找当前根目录下的各个缺省文件是否存在,如果存在就返回缺省文件给客户端。不过需要注意的是,eJet系统中这个流程是在设置DocURI时处理的。
HTTP资源位置如果是Proxy类型或FastCGI类型,则必须配置转发地址passurl,转发地址passurl一般都为绝对URL地址,含有指向其他服务器的domain域名,passurl的形式取决HTTPLoc资源类型。
反向代理(Reverse Proxy)就是将HTTPLoc的资源类型设置为Proxy模式,通过设置passurl指向要代理的远程服务器URL地址,来实现反向代理功能。在反向代理模式下,passurl可以是含有匹配结果变量的URL地址,这个地址指向的是待转发的下一个Origin服务器,匹配变量如果为1、1、2等数字变量,即表示基于正则表达式匹配路径时,把第一个或第二个匹配字符串作为passurl的一部分。当然passurl可以包含任何全局变量或配置变量,使用这些变量可以更灵活方便地处理转发数据。