需求
仅通过IP或者单一域名访问的情况下,根据不同的url前缀,指向不同的根目录。给用户的感觉是访问了不同的站点。
例如http://localhost/aaa
则访问站点a,http://localhost/bbb
则访问站点b,http://localhost/aaa/ccc
则访问站点c
真正的Vhost
真正意义上Vhost,是使用域名作为区分。也就是server_name
字段。这类配置方式广为人知。
URL前缀区分
要通过url前缀区来区分站点,本质上还是通过配置多级location
来实现,顶层使用location ^~
作为区分,里面有独立的access_log
策略,有嵌套的location
作为动态静态控制。
不过笔者在实践的时候,还是遇到了一些小坑。
root还是alias
根据官方讲义
http://nginx.org/en/docs/http/ngx_http_core_module.html#alias
|
|
使用两个配置,在访问lcoalhost/images/a.jpg
时,最终读取的都是/data/w3/images/a.jpg
。
使用root
,location
后的URI也会一并包含在访问路径中,/data/w3/
+images/a.jpg
。
使用alias
,location
后的URI不回包含在访问路径中,/data/w3/images/
+a.jpg
。
alias
还可以实现如下的高级用法,不过alias
的路径一定要有/
结尾,不然就妥妥的404吧。
不带斜杠的情况
访问http://localhost/aaa
和http://localhost/aaa/
的时候,都应该视为访问站点a。这里针对/aaa
做了跳转的处理方式
嵌套路径
针对http://localhost/aaa/ccc
指向站点c的情况。需要使用location ^~
前缀匹配的方式,因为nginx在进行location匹配的时候,会寻找尽可能匹配的情况,这于先后顺序无关。
比如,访问http://localhost/aaa/ccc
会匹配到下一条。
|
|
PHP
通过fastcgi访问php时。$fastcgi_script_name
将被赋值成URI,或者是URI+/index.php
。
在访问http://localhost/aaa/
时,$fastcgi_script_name
为/aaa/index.php
,但aaa
是不应出现在变量中,否则会导致路径错误。
我们使用fastcgi_split_path_info
对URI进行处理,略去aaa
前缀部分,并设置正确的SCRIPT_FILENAME
。
这样,对于SCRIPT_FILENAME
和SCRIPT_NAME
,都可以将其设置为正确值。
参考讲义
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#variables
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info
成品
|
|